gpt4 book ai didi

c# - 如何使 FakeItEasy 伪造对象的方法在第一次调用时抛出并在第二次调用时返回?

转载 作者:太空狗 更新时间:2023-10-30 00:14:52 25 4
gpt4 key购买 nike

我有一个在 foreach 循环中多次调用的方法,每次都使用相同的参数值。

foreach (var item in myCollection)
{
// do some stuff with item
// then...
var result = _myService.Foo(aConstant, anotherConstant);
// do something with result
}

我正在尝试编写一个测试,以确保循环继续迭代,即使 _myService.Foo() 在第一次通过时抛出异常也是如此。

Moq ,我可以像这样将对 ReturnsThrows 的调用链接在一起:

mockService.Setup(x => x.Foo(aConstant, anotherConstant)).Throws<Exception>().Returns(someResult);

这将导致对 Foo 的调用抛出异常,但所有后续调用将返回 someResult。我的主要目标是确保将 try/catch block 包裹在我的 foreach block 内的代码的后半部分,以便即使发生异常也能继续循环。

foreach (var item in myCollection)
{
// do some stuff with item
// then...
try
{
var result = _myService.Foo(aConstant, anotherConstant);
// do something with result
}
catch (Exception e)
{
// ignore any exceptions here and continue looping
}
}

我怎样才能在 FakeItEasy 中完成类似的事情? ?或者我可以使用不同的(更好的)策略来进行这种断言吗?

最佳答案

您现在可以使用“Then”链接配置。您可以在 changing behavior between calls 的 FakeItEasy 文档中阅读更多相关信息.

这是一个例子:

public interface IFoo
{
int Do();
}

[Test]
public void ThrowsFirstTime()
{
var fakeFoo = A.Fake<IFoo>();
A.CallTo(() => fakeFoo.Do()).Throws<Exception>().Once().Then.Returns(1);

Assert.Throws<Exception>(()=>fakeFoo.Do());
int t = fakeFoo.Do();

A.CallTo(() => fakeFoo.Do()).MustHaveHappened(Repeated.Exactly.Twice);
Assert.That(t, Is.EqualTo(1));
}

关于c# - 如何使 FakeItEasy 伪造对象的方法在第一次调用时抛出并在第二次调用时返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com