Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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#/xUnit/Moq_C#_Moq_Xunit - Fatal编程技术网

单元测试方法,它只调用单个依赖项方法-c#/xUnit/Moq

单元测试方法,它只调用单个依赖项方法-c#/xUnit/Moq,c#,moq,xunit,C#,Moq,Xunit,不好意思承认这一点,但单元测试对我来说还是一件新鲜事。我对如何妥善处理事情有着相当坚定的理解。但我发现很难理解的一种情况是,当为一个方法编写单元测试时,该方法只返回依赖方法调用的结果 我发现在实现服务层以与DAL层进行互操作的情况下,会有几次出现这种情况 一个简单的代码示例可能会更好地描述我的问题 注意:下面的代码示例使用的是c#、xUnit和Moq 公共类Foo{ 巴内; Baz串; } 公共接口IFooRepository{ Foo GetByBar(bar int); } 公共接口iFoo

不好意思承认这一点,但单元测试对我来说还是一件新鲜事。我对如何妥善处理事情有着相当坚定的理解。但我发现很难理解的一种情况是,当为一个方法编写单元测试时,该方法只返回依赖方法调用的结果

我发现在实现服务层以与DAL层进行互操作的情况下,会有几次出现这种情况

一个简单的代码示例可能会更好地描述我的问题

注意:下面的代码示例使用的是c#、xUnit和Moq

公共类Foo{
巴内;
Baz串;
}
公共接口IFooRepository{
Foo GetByBar(bar int);
}
公共接口iFoosService{
Foo GetByBar(bar int);
}
公共类FooService:IFooService{
私有IFooRepository;
公共食品服务(
IFooRepository(存储库){
this.fooRepository=fooRepository;
}
公共Foo GetByBar(bar int)
{
返回foodrepository.GetByBar(bar);
}
}
[事实]
公共类FooServiceTests
{
公共类GetByBarMethod
{
[事实]
public void ShouldReturnBar()
{
//安排
var expectedFoo=newfoo(){Bar=1,Baz=“Baz”};
var repo=new Mock();
repo.Setup(r=>r.GetByBar(1)).Returns(expectedFoo);
var service=新的FooService(repo.Object);
//表演
var result=service.GetByBar(1);
//断言
Assert.Same(结果,expectedFoo);
}
}   
}

我理解
FooService
单元测试的重点是测试方法中的逻辑,而不是依赖关系。因此,如果只是测试模拟依赖项的返回值,那么在这种情况下编写测试是否有意义呢?

这是为了回答您的评论

您能解释一下如何断言调用该方法吗

有两种方法

首先是使
设置
期望
可验证()

然后在调用后断言它

//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
repo.Verify(); //Verifies that all verifiable expectations have been met.
第二种方法是使用类似于
Verify

比如说

//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
Assert.Same(result, expectedFoo);
repo.Verify(r => r.GetByBar(1));

参考

您正在测试被测方法是否会按预期运行。而在这种情况下,它是相当简化的。不要关注实施方面的问题。确保最终测试是从依赖项中获取值,目标是测试被测试的方法在执行时的行为是否符合预期。感谢反馈!正如在问题的最后提到的,我理解这一点。我只是想确认我的逻辑是正确的(即,尽管简单,但这里的测试是有意义的)。是的,测试是有意义的。与其说是测试哪种方法,还不如说是测试的目的。在本例中,您真正想要测试的是服务正在使用存储库。它作为依赖项传递给您的服务,但是什么保证代码实际上在调用其中的repo呢?因此,您的测试名称将成为
ShouldUseRepository
或类似的名称。然后,您可以检查是否调用了repo的
GetByBar
方法。@pimbrouwers moq有一个验证方法,可用于验证是否调用了成员。是否确实需要验证?我已经使用了很多验证,但从未使用过验证。
//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
repo.Verify(); //Verifies that all verifiable expectations have been met.
//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
Assert.Same(result, expectedFoo);
repo.Verify(r => r.GetByBar(1));