0

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

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 实例。

请帮助我了解我的模拟设置有什么问题?我使用最小起订量 4.0

4

1 回答 1

2

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

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

public ReportViewModel(IExecutionDetailsReportRepository xdrp)

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

http://www.ninject.org/

http://unity.codeplex.com/

于 2013-05-24T19:56:06.820 回答