如何Moq一个具有参数并且必须对列表执行某些操作的方法

时间:2010-10-19 14:37:35

标签: asp.net-mvc moq

我已经使用Moq 3.0设置了测试。我需要测试一个会改变该数据库中某些值的方法。我正在使用ASP.NET MVC,所以我想测试我的控制器。

我设置了这个

 // Generate an implementer of IProductsRepository at runtime using Moq
 var mockTareasRepos = new Mock<IRepository>();
 mockTareasRepos.Setup(x => x.ExecutedTask).Returns(tasks.AsQueryable());
 return mockTareasRepos.Object;

我需要添加一个获取taskId的新方法,并更改任务列表中字段的值。假设我需要更改的值是StartTime,它是一个日期时间,我需要将值设置为null,我需要设置该retrys值加1。

这是任务类

public class {
     int taskId {get;set;}
     DateTime StartTime  {get;set;}
     int retrys {get;set;}
}

我是怎么做到的?

 mockTareasRepos.Setup(x => x.SetToExecuteTask(It.IsAny<int>()))

我希望你明白我的需要,我的英语不太好。

2 个答案:

答案 0 :(得分:1)

如果我理解它,你想在调用Controller的方法后测试它,你的数据库值应该更新。你嘲笑你的存储库是因为你不想设置测试数据库,对吧?所以,你的测试应该是这样的:

mockTareasRepos.Setup(...) //Do the setup you need.
var controller = new YourController(mockTareasRepos);
controller.YourMethod();
mockTareasRepos.Verify(x => x.YourRepositoryUpdateMethod(It.IsAny<Task>, Times.Once())); 

最后一行将验证您的控制器是否调用了一次“YourRepositoryUpdateMethod”方法。通过执行此操作,您的控制器方法调用Repository接口以更新数据库的测试。

我希望它有所帮助。如果这不是您想要的,请提供更多信息。

答案 1 :(得分:1)

我相信你正在寻找Callback方法:

mockTareasRepos.Setup(x => x.RepositoryMethod(...))
    .Callback<IEnumerable<Task>>(tasks => /* modify tasks here */);
    .Returns(tasks.AsQueryable());