asp.net-mvc-3 – 如何使用MVC3中的存储库类进行单元测试?
发布时间:2020-12-16 07:17:27 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试对我的控制器进行测试,这些控制器从存储库类中获取数据. 这是我要测试的存储库的一部分: public class NewsRepository{ public IEnumerableNewsItem GetNews() { var result = (from n in n_db.NewsItems orderby n.ID descending select n).Take
我正在尝试对我的控制器进行测试,这些控制器从存储库类中获取数据.
这是我要测试的存储库的一部分: public class NewsRepository { public IEnumerable<NewsItem> GetNews() { var result = (from n in n_db.NewsItems orderby n.ID descending select n).Take(3); return result; } } 只是一些小代码来了解测试的工作原理. public ActionResult Index() { ViewBag.Message = "Announcements"; NewsRepository n_rep = new NewsRepository(); var model = i_rep.GetNews(); return View(model); } 我对测试完全陌生,所以所有解释都很棒. 解决方法
您的控制器无法单独进行单元测试,因为它与以下行中的存储库紧密耦合:
NewsRepository n_rep = new NewsRepository(); 您只需硬编码存储库的特定实现,并且在单元测试中您无法模拟它.为了正确地执行此操作,您应该首先在此存储库上定义抽象: public interface INewsRepository { IEnumerable<NewsItem> GetNews(); } 然后让您的特定存储库实现此接口: public class NewsRepository : INewsRepository { ... } 好了,现在我们有了一个抽象,让我们通过使用这个抽象来削弱数据访问和控制器逻辑之间的耦合: public class NewsController: Controller { private readonly INewsRepository repository; public NewsController(INewsRepository repository) { this.repository = repository; } public ActionResult Index() { ViewBag.Message = "Announcements"; var model = this.repository.GetNews(); return View(model); } } 好吧,现在你有一个控制器不再与某些特定的实现紧密结合.您可以拾取您最喜欢的模拟框架并编写单元测试.例如,对于 [TestMethod] public void Index_Action_Fetches_Model_From_Repo() { // arrange var repo = Substitute.For<INewsRepository>(); IEnumerable<NewsItem> expectedNews = new[] { new NewsItem() }; repo.GetNews().Returns(expectedNews); var sut = new NewsController(repo); // act var actual = sut.Index(); // assert Assert.IsInstanceOfType(actual,typeof(ViewResult)); var viewResult = actual as ViewResult; Assert.AreEqual(expectedNews,viewResult.Model); } 这就是它.您的控制器现在可以单独进行单元测试.您不需要设置数据库或其他任何东西.这不是测试控制器逻辑的重点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc-4 – 使用Razor更改MVC4中html.editorfor帮助程
- asp.net-mvc – ASP.NET MVC将表单值传递给action方法
- asp.net-mvc-3 – .NET MVC 3自定义十进制?模型粘合剂
- asp.net – 让Sql Server数据工具与Visual Studio 2012 Exp
- 使用模块化设计组织良好的ASP.NET应用程序的最佳方法
- 运行命令(CMD)大全
- asp.net-mvc – 为什么人们在MVC中使用Web API控制器
- asp.net-core – .NET Core 2中缺少TaskCache类
- nuget-package – 如何创建和使用ASP.NET vNext类库NuGet包
- asp.net – MVC 3 htmlhelper的扩展方法来包装内容
推荐文章
站长推荐
- asp.net-mvc-4 – 如何使用mvc 4中的bundle删除版
- asp.net-web-api – 随着SerilogWeb.Owin停产,是
- ELMAH没有在MVC3中显示原始ASP.NET错误页面
- asp.net-mvc-3 – IIS7中的NLog在发布模式下失败
- .NET Core中Object Pool的简单使用
- asp.net-mvc – ASP.NET MVC控制器动作设计
- ASP.NET MVC ViewModel模式
- asp.net-mvc – ASP.NET MVC中Rake路由的等价物
- Cassini上的ASP.NET MVC:如何强制“内容”目录返
- asp.net – App_Start文件夹在ASP 4.5仅在WebApp
热点阅读