我正在努力让这个用例适用于我:
我有一个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
答案 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);
}