我有以下需要测试的类 .
public ReportViewModel
{
public ReportViewModel()
{
using (var repository = new ExecutionDetailsReportRepository())
{
this._reportData= repository.GetExecutionDetailsReport(testManager.ExecutionDetail.ExecutionId);
}
}
}
构造函数创建一个新的ExecutionDetailsReportRepository,这需要进行模拟
我的测试方法有这样的模拟设置
var mockExecutionDetailsReportRepository = new Mock<IExecutionDetailsReportRepository>(MockBehavior.Loose);
mockExecutionDetailsReportRepository.Setup(ed => ed.GetExecutionDetailsReport(null)).Returns((List<ExecutionDetailsReport> x) => x).Verifiable();
GetExecutionDetailsReport采用int?作为参数类型 . 我尝试用0或It.IsAny设置它,但我的测试最终仍然创建了一个新的GetExecutionDetailsReport实例,而不是使用Mocked实例 .
请帮我理解我的模拟设置有什么问题?我正在使用Moq 4.0
1 回答
正如Doc所说,您将需要注入Repository实例 . 依赖注入本质上是Mocking的先决条件 . 阅读ninject或Unity(统一Dependency Injector,而不是游戏引擎) .
最常见的模式是“构造函数注入”,并且会使您的构造函数看起来像
然后,您将使用xdrp而不是New'd up实例 . 在测试中你传递了你的模拟,在你的实时代码中,你将依靠Unity,Ninject等在那里获得一个实例......正如我所说,阅读那些:
http://www.ninject.org/
http://unity.codeplex.com/