当前位置: 首页 > 知识库问答 >
问题:

如何在模拟异步方法上设置可验证的期望?[重复]

吴西岭
2023-03-14

我试图使用Moq测试WebAPI控制器和Redis数据库之间的集成,使用StackExchange。Redis客户端,无法计算出如何在包含回调或其他断言行为的模拟异步方法上设置可验证的期望。

通常,我会使用以下语法:

const string KEY = "some_key";
var db = new Mock<IDatabase>();
db.Setup(d => d.HashSetAsync(KEY, It.IsAny<HashEntry[]>(),It.IsAny<CommandFlags>()))
    .Callback<RedisKey,HashEntry[],CommandFlags>((key, hash, flags) => {
                hash.ShouldContain(entry => entry.Name == "customerid");
                hash.ShouldContain(entry => entry.Name == "quotenumber");
     })
     .Verifiable();

但这给了我:

“最低起订量。语言流我转身

如果我更改db。HashSetAsyncdb。HashSetSetup调用中,它按预期工作。在常规方法上设置Callback似乎会返回一个ICallBackResult,但是在异步方法调用上设置回调会返回一个IReturnsThrows-我不确定您如何将其中一个标记为可验证的。有什么想法吗?

共有1个答案

蒋文光
2023-03-14

对于异步方法,在使用回调之前,需要从安装程序返回已完成的任务

请看这里:

使用Moq模拟单元测试的异步方法

您正在创建一项任务,但从未启动它,因此它从未完成。但是,不要只是启动任务,而是改为使用任务。FromResult

这很有效

const string KEY = "some_key";
var db = new Mock<IDatabase>();
db.Setup(d => d.HashSetAsync(KEY, It.IsAny<HashEntry[]>(), It.IsAny<CommandFlags>()))
    .Returns(Task.FromResult<object>(null))
    .Callback<RedisKey, HashEntry[], CommandFlags>((key, hash, flags) => {
        hash.ShouldContain(entry => entry.Name == "customerid");
        hash.ShouldContain(entry => entry.Name == "quotenumber");
    })
    .Verifiable();

 类似资料:
  • 我使用moment.js在React组件的辅助文件中执行大部分日期逻辑,但我还没有弄清楚如何在Jest a la中模拟日期。 Jest文档只介绍计时器函数,如,等,但不帮助设置日期,然后检查my date函数是否完成了它们的任务。 以下是我的一些JS文件: 下面是我用玩笑设置的: 现在这些测试通过了,因为我使用的是矩,我的函数使用的是矩,但它似乎有点不稳定,我想为测试设置一个固定的时间。 你知道怎

  • 用mockito模仿异步(< code>@Async)方法的最好方法是什么?提供以下服务: 莫基托的验证如下: 测试方法上面将始终抛出: 如果我从方法中删除,则不会发生上述异常。 Spring Boot版本:1.4.0.RELEASE Mockito版本:1.10.19

  • 问题内容: 似乎模拟仅验证模拟对象的方法是否被调用,并且模拟对象始终具有类似以下内容的东西 但是我可以创建一个模拟对象并定义 然后验证另一个对象的方法是否被调用吗? 这是我想做的事情:我定义了一个模拟环境,无论发生什么情况都返回一个响应。但是然后我想验证在不同情况下调用anotherObj的不同方法。 怎么做? 问题答案: 您可以为此使用Mockito Spy。如果您设置为间谍,则可以验证该对象上

  • 考虑以下代码: 我想做的是,在异常测试中,标记我希望调用doSomething1()。然而,在转换器上抛出异常。convert(),这意味着永远不会调用verify()调用。因此,verifyNoMoreInteractions()在after()中失败。 注意:这是一个非常通用的示例,用于隐藏我们的任何内部代码。

  • 我试图对一个抽象类进行单元测试,因此需要为该类的抽象方法提供一个模拟实现。 我想我是在一个利基的情况(!)因为或似乎都没有帮助。 尝试但这完全破坏了我的抽象类(创建它时不调用构造函数,运行到NPE) 尝试了,但这要么需要一个真实类的实例(我不能提供它,因为它是抽象的duh),要么尝试调用一个不存在的no-arg构造函数。

  • 我正在尝试通过Spring Boot建立一个SFTP连接。我使用的是密码身份验证而不是私钥。当我启动应用程序时,它首先尝试通过gssapi-with-mic进行身份验证,然后Kerberos提示输入凭据。在我通过Kerberos按键之后,应用程序就会尝试寻找私钥。在没有找到关于密钥的任何细节之后,它将最终尝试提供给会话工厂的凭据,并按预期工作。由于这个应用程序将生活在Docker构建中,我需要它首