C# 如何模拟要测试的方法(在模型中)中使用的存储库方法
我正在尝试让这个用例为我工作: 我有一个存储库类:C# 如何模拟要测试的方法(在模型中)中使用的存储库方法,c#,asp.net-mvc-4,ninject,moq,xunit,C#,Asp.net Mvc 4,Ninject,Moq,Xunit,我正在尝试让这个用例为我工作: 我有一个存储库类:ABCRepository 它有一个虚拟方法GetMyValues() 模型类:ABCModel,具有方法ABCToTest()。 在这个ABCToTest()中,我试图使用以下方法访问abcreposition: var repo=kernel.Get(); //进一步使用存储库方法 var results=repo.GetMyValues(); 现在,我使用以下代码为ABCToTest()创建Unittest并模拟GetMyValues()
ABCRepository
它有一个虚拟方法GetMyValues()
模型类:ABCModel
,具有方法ABCToTest()
。
在这个ABCToTest()
中,我试图使用以下方法访问abcreposition
:
var repo=kernel.Get();
//进一步使用存储库方法
var results=repo.GetMyValues();
现在,我使用以下代码为ABCToTest()创建Unittest并模拟GetMyValues()方法:
var kernel=new MoqMockingKernel();
kernel.Bind().ToMock();
kernel.Bind().ToMock();
var abcRepo=kernel.GetMock();
Setup(repo=>repo.GetMyValues())。返回(“ABC”);
//这是我用来初始化内核对象的静态方法,ABCToTest()方法正在使用。
mvcapapplication.InitializeInjection(内核);
var model=kernel.GetMock().Object;
模型试验(“177737”);
当我试图调试/运行测试时,我可以看到,ABCTotTest
中的GetMyValues()
方法调用没有返回“ABC”,而是NULL
我用这个实现做了什么?非常感谢您的建议和指点
谢谢和问候
sumeet看起来您偶然发现了服务定位器反模式() 您应该更改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);
}
private-mockRepo;
私有ABC模型;
[设置]
公共作废设置()
{
mockRepo=新Mock();
模型=新的ABCModel(mockRepo.Object);
}
[测试]
调用时的公共无效ABCToTest
{
模型试验(“177737”);
验证(a=>a.GetMyValues(),Times.Once);
}
看起来您偶然发现了服务定位器反模式()
您应该更改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);
}
private-mockRepo;
私有ABC模型;
[设置]
公共作废设置()
{
mockRepo=新Mock();
模型=新的ABCModel(mockRepo.Object);
}
[测试]
调用时的公共无效ABCToTest
{
模型试验(“177737”);
验证(a=>a.GetMyValues(),Times.Once);
}