Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/148.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# 如何在Moq和x27上使用回调;设置顺序?_C#_Mocking_Moq - Fatal编程技术网

C# 如何在Moq和x27上使用回调;设置顺序?

C# 如何在Moq和x27上使用回调;设置顺序?,c#,mocking,moq,C#,Mocking,Moq,我使用的是moqversion4.8,有一个方法来模拟和断言它的参数。我从这个模拟的方法开始: mock.Setup(m=>m.Update(It.IsAny)) .Callback((MyClass c)=> { //一些断言 }) .Returns(Task.FromResult(updatedClass)); 在这里,我更新了一个类型为MyClass的对象,并对该对象进行了大量断言。这个很好用 我刚刚为调用Update的方法添加了逻辑,以便在抛出异常时重试调用它。所以我想实现一个新的单元

我使用的是moqversion4.8,有一个方法来模拟和断言它的参数。我从这个模拟的方法开始:

mock.Setup(m=>m.Update(It.IsAny))
.Callback((MyClass c)=>
{
//一些断言
})
.Returns(Task.FromResult(updatedClass));
在这里,我更新了一个类型为
MyClass
的对象,并对该对象进行了大量断言。这个很好用

我刚刚为调用
Update
的方法添加了逻辑,以便在抛出异常时重试调用它。所以我想实现一个新的单元测试,它抛出几次异常,然后返回,并能够像以前一样进行断言。因此,我尝试了
SetupSequence
,如下所示:

mock.SetupSequence(m=>m.Update(It.IsAny))
.Throws(新异常(“测试异常1”))
.Throws(新异常(“测试异常2”))
.Callback((MyClass c)=>
{
//一些断言
})
.Returns(Task.FromResult(updatedClass));

但是
ISetupSequence
不支持
回调
。有没有一种方法可以模拟
抛出
返回
调用,同时保持对
返回
的预调用
回调

目前我一直在做这项工作:

int callCount=0;
mock.Setup(m=>m.Update(It.IsAny))
.Callback((MyClass c)=>
{
callCount++;
if(callCount您可以使用,这样您就可以在
.Setup()
之后添加回调

var mock=new mock(MockBehavior.Strict);
var sequence=新的MockSequence();
_fooService.InSequence(sequence).Setup(x=>x.footMethod(a)).ReturnsAsync(b);
_InSequence(sequence).Setup(x=>x.BarMethod(c)).ReturnsAsync(d);
_InSequence(sequence).Setup(x=>x.BazMethod(e)).ReturnsAsync(f);

您可以在Moq存储库中查看这个问题。也可以在。不确定它是否更优雅,因为它是基于意见的链接,它们很有用。还重新编写了问题,使其不那么基于意见。我的工作对我来说就像是一个黑客,这就是为什么我在寻找更好的方法。您检查了吗?尽管您可以l
.Setup
在一个
插入序列上,你不能调用
.Throw
.Callback
,这就是我要找的。
var mock = new Mock<IFoo>(MockBehavior.Strict);
var sequence = new MockSequence();

_fooService.InSequence(sequence).Setup(x => x.FooMethod(a)).ReturnsAsync(b);
_barService.InSequence(sequence).Setup(x => x.BarMethod(c)).ReturnsAsync(d);
_bazService.InSequence(sequence).Setup(x => x.BazMethod(e)).ReturnsAsync(f);