Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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中方法的执行顺序_C#_Asp.net Core_Moq_Xunit.net_Method Chaining - Fatal编程技术网

C# 验证Xunit中方法的执行顺序

C# 验证Xunit中方法的执行顺序,c#,asp.net-core,moq,xunit.net,method-chaining,C#,Asp.net Core,Moq,Xunit.net,Method Chaining,我必须编写测试用例来验证链式方法的执行顺序。 假设我已经编写了如下所示的代码 _store .SetInput(input1) .Method1() .Method2() .Method3(); 我如何编写一个测试用例来检查首先执行的SetInput、第二次执行的method1等等? 如果有人改变了方法链接的实际实现或顺序,那么测试用例应该失败。 我知道我不能模拟扩展方法,那么编写测试用例以检查方法执行顺序的最佳方法是什么。让我们假设您的\u存储实现

我必须编写测试用例来验证链式方法的执行顺序。 假设我已经编写了如下所示的代码

 _store 
     .SetInput(input1)
     .Method1()
     .Method2()
     .Method3();
我如何编写一个测试用例来检查首先执行的SetInput、第二次执行的method1等等? 如果有人改变了方法链接的实际实现或顺序,那么测试用例应该失败。
我知道我不能模拟扩展方法,那么编写测试用例以检查方法执行顺序的最佳方法是什么。

让我们假设您的
\u存储实现以下接口:

公共接口晶体管
{
晶体管设置输入(字符串输入);
晶体管方法1();
晶体管方法2();
IStore方法3();
}
为了简单起见,这里有一个类,它使用了
IStore
实现:

公共类系统测试中
{
专用只读存储;
公共系统未测试(IStore存储)
{
_商店=商店;
}
公共行动
{
_贮藏
.SetInput(“input1”)
.Method1()
.方法2()
方法3();
}
}
因此,为了确保操作以这种特定的顺序执行,我们可以使用
MockSequence
()。下面是一个用于此的单元测试示例:

[事实]
公共无效,无法律规定,当我的行为被称为特定的行为人()的方法时
{
//安排
var storeMock=new Mock();
var expectedSequence=new MockSequence();
Setup(x=>x.SetInput(It.IsAny()))
.Returns(storeMock.Object);
storeMock.InSequence(expectedSequence).Setup(x=>x.Method1())
.Returns(storeMock.Object);
storeMock.InSequence(expectedSequence).Setup(x=>x.Method2())
.Returns(storeMock.Object);
storeMock.InSequence(expectedSequence).Setup(x=>x.Method3())
.Returns(storeMock.Object);
var SUT=新的SystemUnderTest(storeMock.Object);
//表演
SUT.MyAction();
//断言
验证(store=>store.SetInput(“input1”),次.Once);
}
如果在单元测试中或在
MyAction
方法中更改顺序,它将失败,并出现
NullReferenceException
,因为它无法调用null上的下一个方法

更改
MyAction

public void MyAction()
{
_贮藏
.SetInput(“input1”)
.方法2()
.Method1()//NullReferenceException
方法3();
}
更改模拟序列的顺序

//排列
var storeMock=new Mock();
var expectedSequence=new MockSequence();
Setup(x=>x.SetInput(It.IsAny()))
.Returns(storeMock.Object);
storeMock.InSequence(expectedSequence).Setup(x=>x.Method1())
.Returns(storeMock.Object);
storeMock.InSequence(expectedSequence).Setup(x=>x.Method3())
.Returns(storeMock.Object);
storeMock.InSequence(expectedSequence).Setup(x=>x.Method2())
.Returns(storeMock.Object);
因此,您的
设置
调用不会提前产生任何影响。从
MyAction
调用
SetInput
时,将按顺序执行第一次设置。
如果您尝试在调用
Method1
Setup
之前调用
Method2
,那么它将失败。

这只适用于接口中的方法,但在我的例子中,SetInput(“input1”)、Method1()、Method2()、Method3()是扩展方法,我不能像这样在设置中编写它(x=>x.Method1())@Pavanamchure您不能直接模拟扩展方法,因为它们是
静态的