我正在使用 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
?
最佳答案
您可以使用 MockSequence ,以便您可以在 .Setup()
后添加回调.
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);
关于c# - 如何在 Moq 的 SetUpSequence 上使用回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65030576/