Moq呼唤真实的实例

时间:2013-05-24 19:38:29

标签: c# unit-testing moq mstest

我有以下需要测试的课程。

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 个答案:

答案 0 :(得分:2)

正如Doc所说,你需要注入Repository实例。依赖注入本质上是Mocking的先决条件。阅读ninject或Unity(统一了Dependency Injector,而不是游戏引擎)。

最常见的模式是“构造函数注入”,并且会使您的构造函数看起来像

public ReportViewModel(IExecutionDetailsReportRepository xdrp)

然后,您将使用xdrp而不是New'd up实例。在测试中你传递了你的模拟,在你的实时代码中,你将依靠Unity,Ninject等来获取一个实例...正如我所说,阅读那些:

http://www.ninject.org/

http://unity.codeplex.com/