我已经使用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>()))
我希望你明白我的需要,我的英语不太好。
答案 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());