【发布时间】:2020-11-26 23:59:24
【问题描述】:
我使用的是 Moq 4.8 版,并且有一个模拟和断言其参数的方法。我从这个模拟方法开始:
mock.Setup(m => m.Update(It.IsAny<MyClass>))
.Callback((MyClass c) =>
{
// some assertions
})
.Returns(Task.FromResult(updatedClass));
我更新MyClass 类型的对象并对该对象执行许多断言。这工作得很好。
我刚刚为调用Update 的方法添加了逻辑,以便在抛出异常时重试调用它。所以我想实现一个新的单元测试,它会抛出几次异常然后返回并能够像以前一样进行断言。于是我试了SetupSequence如下:
mock.SetupSequence(m => m.Update(It.IsAny<MyClass>))
.Throws(new Exception("test exception 1"))
.Throws(new Exception("test exception 2"))
.Callback((MyClass c) =>
{
// some assertions
})
.Returns(Task.FromResult(updatedClass));
但是ISetupSequence 不支持Callback。有没有办法按顺序模拟Throws 和Returns 调用,同时保持Callback 到Returns 的预调用?
【问题讨论】:
-
您可以查看 Moq 存储库中的 #573 问题。以及Moq sequential callbacks。不确定它是否更优雅,因为它是基于意见的
-
感谢您的链接,它们很有帮助。还改写了问题,以减少基于意见的问题。我的工作对我来说就像是一个黑客,这就是为什么我正在寻找一种更好的方法来做这件事。
-
你检查过this吗?