我希望能够编写测试代码。但我的Action与我的DataContext相关联。如何删除依赖?
public ViewResult About()
{
var db = new CamaDataContext();
var item = new PropertyViewModel();
AutoMapper.Mapper.Map(db.dataProperty.FirstOrDefault(),item);
return View(item);
}
答案 0 :(得分:2)
为不同的实体创建存储库接口。
为不同的实体创建具体的存储库。
将这些存储库存储在控制器级别。
使用Controller的构造函数允许存储库被注入(如果没有提供,则使用Concrete实现)。
这将允许您在单元测试期间模拟存储库,以便两者不紧密耦合。
答案 1 :(得分:1)
使用依赖注入框架(如ninject或structuremap)通过控制器的构造函数传递它,然后在编写测试时,可以在思想构造函数中传递这些依赖项。
这也可以让你有机会模拟这些依赖项,而不是在测试时实际上不必调用数据库
答案 2 :(得分:1)
您可以轻松地重构上述代码以进行测试(假设您有一些业务逻辑需要测试)。任何逻辑都会移出到您在X实体中传递给的类。然后,您只需通过填充类并将其发送来测试您的逻辑。
作为替代方案,保持控制器动作非常轻便,因此可能不需要测试。
另外,在单独的说明中,处理您的上下文类:
使用(var db = new CamaDataContext()) { .. 返回视图(..) }还要考虑此处所示的[AutoMap()]属性,以使您的操作方法更加精简。
http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/
我想在控制器中使用双线方法,因为这样不需要测试。
答案 3 :(得分:1)
微软有一个很棒的教程。这不是完全直截了当的,但对课程的好学习以及尝试将其付诸实践将有助于您理解它。
它特定于实体框架,但原则仍适用于非EF工作。
答案 4 :(得分:0)
您可以查看IoC容器,例如Castle Windsor,SpringFramework.net或StructureMap。这是他们的目标核心。