繁体   English   中英

如何使用Moq位置/过程进行单元测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM