gpt4 book ai didi

c# - 我可以使用 Moq 的 SetupSequence 抛出异常然后返回 void 吗?

转载 作者:行者123 更新时间:2023-11-30 19:53:37 24 4
gpt4 key购买 nike

我试图将 Moq 设置为在第一次调用时抛出异常,然后在第二次调用时返回 void。我正在模拟的方法有一个 void 返回类型(例如 public void Bar())。

我尝试过的事情

这有编译错误,因为 Returns 需要一个参数,而 SetupSequence 需要类型参数。

_mock.SetupSequence(m => m.Bar())
.Throws<Exception>()
.Returns();

这有一个编译错误,因为 Void 不是 C# 中的类型。

_mock.SetupSequence<IMyMock, Void>(m => m.Bar())
.Throws<Exception>() // first invocation throws exception
.CallBase();

解决方法

最后我放弃了SetupSequence(),改用Callback()来抛出异常。

var firstTime = true;
_mock.Setup(m => m.Bar())
.Callback(() =>
{
if (firstTime)
{
firstTime = false;
throw new Exception();
}
});

问题

SetupSequence 采用Func,而不是Action。我是否正确地假设这意味着 SetupSequence() 不能用于模拟 void 方法?

最佳答案

您可以从 Moq 4.8.0 开始执行此操作:

SetupSequencevoid 方法的支持已在 GitHub 问题 #451 中讨论并添加了 GitHub 拉取请求 #463 .

您可能正在寻找新的 .Pass() 方法:

mock.SetupSequence(m => m.VoidMethod())
.Throws(new InvalidOperationException())
.Pass()
.Pass()
.Throws(new InvalidOperationException())
.Pass();

请注意,对 .Pass() 的尾随调用可能是不必要的。

关于c# - 我可以使用 Moq 的 SetupSequence 抛出异常然后返回 void 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47743915/

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