[英]How to unit test with Moq location/process
所以我对测试很新,我从来没有真正做过多,所以我可能缺乏一些基础知识。
问题1:我正在使用ASP MVC4并希望将Moq用于我的单元测试用例。 阅读后有很多例子,我看到我想有一个界面。 究竟应该去哪里? 在控制器文件夹中,测试项目?
问题2如果我在我的控制器中测试一个方法,并且它有多次调用db,我将如何调用Moq
public ActionResult Index()
{
var model = new myModel();
var pList = new List<myModel.pType>();
var sList = new List<myModel.sType>();
var results = Class1.FetchPData(); // how would I mock this
var result1 = Class1.FetchSData(); // how would I mock this
for (int i = 0; i < results.Count(); i++)
{
... do stuff
}
for (int j = 0; j < result1.Count(); j++)
{
..do stuff
}
return View("Index", model);
}
我是否必须创建另一个包含相同逻辑的方法,但是我必须将“Mock Object”作为方法的参数传入,并将其作为我的界面中的可实现方法? 或者重新实施我的方法?
阅读后有很多例子,我看到我想有一个界面。 究竟应该去哪里? 在控制器文件夹中,测试项目?
没有规则可以保留接口,但通常会将它们与使用它们的代码紧密联系起来。 通常我在单独的程序集中有域类和服务,并在那里定义了存储库接口。 然后我通过Data Access程序集引用这个程序集,它具有存储库接口的实现。 最后一步 - 我从Web应用程序引用两个程序集。
如果我在我的控制器中测试一个方法,并且它有多次调用db,我将如何使用Moq
请记住,良好的单元测试应该是快速,隔离,可重复,自我验证和及时( FIRST )。 在控制器中进行数据库调用不允许您快速运行测试(数据库调用与内存代码相比非常慢),单独测试控制器并使测试始终可重复。 此外,您的控制器只对很多事情做了(即违反了SRP原则) - 它获取用户输入,进行数据库查询并为视图准备模型。
因此,为了分离责任并使控制器可测试,您应该将与数据访问相关的代码提取到单独的类(通常称为存储库的类)。 并创建抽象,指定控制器和存储库之间的API:
public interface IYourRepository
{
IEnumerable<pType> FetchPData();
IEnumerable<sType> FetchSData();
}
然后让你的控制器依赖于这个抽象(逆依赖),并将存储库注入控制器(你可以使用Ninject,Unity或其他依赖注入框架):
IYourRepository _repository;
public YourController(IYourRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
var model = new myModel();
foreach (var p in _repository.FetchPData())
// do stuff
foreach (var s in _repository.FetchSData())
// do stuff
return View("Index", model);
}
这将允许您轻松地模拟存储库并向控制器提供模拟对象:
var repositoryMock = new Mock<IYourRepository>();
repositoryMock.Setup(r => r.FetchPData()).Returns(pList);
repositoryMock.Setup(r => r.FetchSData()).Returns(sList);
var controller = new YourController(repositoryMock.Object);
var result = controller.Index();
// Assertions
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.