1

我试图让这个用例为我工作:

我有一个存储库类:ABCRepository 它有一个虚拟方法GetMyValues()

一个模型类:ABCModel,有一个方法ABCToTest()。在这里面ABCToTest(),我正在尝试ABCRepository使用Ninject访问:

  var repo =  kernel.Get<ABCRepository>();

    //further using repository method

    var results =  repo.GetMyValues();

现在,我正在使用以下代码为 ABCToTest() 创建 Unittest 并模拟 GetMyValues() 方法:

            var kernel = new MoqMockingKernel();

            kernel.Bind<ABCRepository>().ToMock();


            kernel.Bind<ABCModel>().ToMock();

            var abcRepo= kernel.GetMock<ABCRepository>();



            abcRepo.Setup(repo => repo.GetMyValues()).Returns("ABC");

//This is a static method I am using to initialize the kernel object, ABCToTest() method is using.
            MvcApplication.InitializeInjection(kernel);

            var model= kernel.GetMock<ABCModel>().Object;

            model.ABCToTest("177737");

当我尝试调试/运行测试时,我可以看到,GetMyValues()里面的方法调用ABCTotTest不是返回“ABC”而是返回NULL

我对这个实现有什么问题?任何建议和指示都非常感谢..

感谢和问候

4

1 回答 1

1

看起来您偶然发现了服务定位器反模式(http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/

您应该更改 ABCModel 类,以便将 ABCRepository 注入构造函数:

private readonly IABCRepository repo;

public ABCModel(IABCRepository repo)
{
    this.repo = repo;
}

然后您的单元测试将如下所示:

private Mock<IABCRepository> mockRepo;
private ABCModel model;

[SetUp]
public void SetUp()
{
    mockRepo = new Mock<IABCRepository>();

    model = new ABCModel(mockRepo.Object);
}    

[Test]
public void ABCToTest_WhenCalled_CallsRepository
{       
    model.ABCToTest("177737");

    mockRepo.Verify(a => a.GetMyValues(), Times.Once);
}
于 2013-11-04T07:21:38.827 回答