asp.net-mvc – 我的ASP.NET MVC控制器应该如何识别存储库
发布时间:2020-12-16 07:03:26 所属栏目:asp.Net 来源:网络整理
导读:我试图了解如何对通过某种存储库访问数据的ASP.NET MVC项目进行单元测试. 在单元测试期间,我显然想要创建一个模拟存储库但是如何将这个模拟存储库传递给正在测试的Controller实例?另外,真正连接到数据库的实际存储库如何找到控制器的路径? 我是否只是通过
我试图了解如何对通过某种存储库访问数据的ASP.NET MVC项目进行单元测试.
在单元测试期间,我显然想要创建一个模拟存储库但是如何将这个模拟存储库传递给正在测试的Controller实例?另外,真正连接到数据库的实际存储库如何找到控制器的路径? 我是否只是通过构造函数执行此操作,如下所示?我认为这是我应该如何设置我的控制器,但我想确认这是正确的: public class SampleController : Controller { private IRepository _repo; //Default constructor uses a real repository // new ConcreteRepo() could also be replaced by some static // GetRepository() method somewhere so it would be easy to modify //which concrete IRepository is being used public SampleController():this(new ConcreteRepo()) { } //Unit tests pass in mock repository here public SampleController(IRepository repo) { _repo = repo; } } 解决方法
正如大家已经说过的那样,你会想要使用IoC *或DI **容器.但他们没有说的是为什么会这样.
我们的想法是,DI容器将允许您绕过ASP.NET MVC的默认控制器构造策略,即需要无参数构造函数.因此,您可以让控制器明确说明其依赖关系(最好是接口).这些接口如何映射到具体实例是DI容器的业务,您可以在Global.asax.cs(实时)或测试夹具设置(用于单元测试)中配置. 这意味着您的控制器不需要了解其依赖项的具体实现,因此我们遵循依赖性倒置原则:“高级模块不应该依赖于低级模块.两者都应该依赖于抽象.” 例如,如果您要使用AutoFac,则可以执行以下操作: // In Global.asax.cs's Application_Start using Autofac; using Autofac.Integration.Mvc; var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.Register<IRepository>(() => new ConcreteRepo()); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // In your unit test: var controllerInstance = new SampleController(new InMemoryFakeRepo()); // In SampleController public class SampleController : Controller { private readonly IRepository _repo; public SampleController(IRepository repo) { _repo = repo; } // No parameterless constructor! This is good; no accidents waiting to happen! // No dependency on any particular concrete repo! Excellent! } * IoC =控制反转** DI =依赖倒置(这两个术语经常互换使用,这不是真正正确的IMO) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 我什么时候应该使用Webservice属性System.Compo
- asp.net – 性能监视器显示活动的4294967293个会话
- 如何为asp.net身份创建安全邮戳值(IUserSecurityStampStore
- asp.net-mvc – 如何使用ASP.NET 5 MVC保护Web API 6
- 当“必须”我使用asp.net CreateChildControls()?
- asp.net – 对良好的自动化Web负载测试工具的任何建议?
- 从ASP.NET MVC应用程序中的Amazon SES发送电子邮件
- asp.net – 如何检测脚本管理器是否在页面上?
- asp.net-mvc – ASP MVC中的“@”是什么意思/做什么?
- 动手造轮子:实现简单的 EventQueue
推荐文章
站长推荐
- asp.net-mvc – 使用html.actionlink将模型从视图
- oauth-2.0 – AspNet身份2:自定义OAuth端点响应
- asp.net-mvc – 不能删除数据库,因为它目前正在使
- Asp.Net Core 第02局:Program
- .net – 使用实体框架作为数据访问层
- 为什么知道Asp.net的生命周期对Asp.net中的编码很
- asp-classic – 是否有像Visual Studio一样的ASP
- Asp.net core利用IIS在windows上进行托管步骤详解
- asp.net-mvc – 如何检测ASP.NET站点是在本地,az
- asp.net-mvc – Firefox在Ajax请求重定向期间不保
热点阅读