我有以下需要测试的课程。
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
答案 0 :(得分:2)
正如Doc所说,你需要注入Repository实例。依赖注入本质上是Mocking的先决条件。阅读ninject或Unity(统一了Dependency Injector,而不是游戏引擎)。
最常见的模式是“构造函数注入”,并且会使您的构造函数看起来像
public ReportViewModel(IExecutionDetailsReportRepository xdrp)
然后,您将使用xdrp而不是New'd up实例。在测试中你传递了你的模拟,在你的实时代码中,你将依靠Unity,Ninject等来获取一个实例...正如我所说,阅读那些: