如何模拟在Method中使用的存储库方法进行测试(在模型中)

时间:2013-07-11 14:48:16

标签: c# asp.net-mvc-4 ninject moq xunit

我正在努力让这个用例适用于我:

我有一个Repository类:ABCRepository 这是一个虚拟方法GetMyValues()

模型类:ABCModel,方法为ABCToTest()。 在ABCToTest()内,我正在尝试使用Ninject访问ABCRepository

  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

我对这个实现做了什么错?任何建议和指示都非常感谢..

谢谢&amp;问候 sumeet

1 个答案:

答案 0 :(得分: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);
}