c# - 如何在 Moq 的 SetUpSequence 上使用回调?

标签 c# mocking moq

我正在使用 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 .有没有办法模拟 ThrowsReturns在保持预调用的同时按顺序调用CallbackReturns ?

最佳答案

您可以使用 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/

相关文章:

java - 使用 querydsl 模拟数据库查询 - 可选问题

.net - 为什么 Moq 不运行重写的 ToString 方法?

c# - 有没有一种方法可以用 Moq 来模拟 DbSet.Find 方法?

c# - 使用 C# 从 Excel 中读取单元格的方法有哪些?

c# - Mono 和 appdomain 安全/权限集

c# - 线程在哪里结束?

.net - Moq - 设置属性以从方法参数返回字符串

c# - 限制 Visual Studio 2005 中测试运行结果的数量

javascript - 使用 nock 模拟具有特定请求 header 的 mocha 中的 super 代理请求

c - 模拟和 Win32 API 调用