Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟要测试的方法(在模型中)中使用的存储库方法_C#_Asp.net Mvc 4_Ninject_Moq_Xunit - Fatal编程技术网

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);
}