首页 文章

Moq呼唤真实的实例

提问于
浏览
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实例 .

请帮我理解我的模拟设置有什么问题?我正在使用Moq 4.0

1 回答

  • 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/

相关问题