xUnit 和 Moq 不支持 async -await 关键字

2024-03-30

我正在尝试探索如何将 async 和 wait 关键字应用到我的 xUnit 测试中。我正在使用 xUnit 1.9 和 Async CTP 1.3。这是我的测试用例

我有一个接口,它指定一个异步方法调用

public interface IDoStuffAsync
{
    Task AnAsyncMethod(string value);
}

我有一个类使用接口并调用异步方法

public class UseAnAsyncThing
{
    private readonly IDoStuffAsync _doStuffAsync;

    public UseAnAsyncThing(IDoStuffAsync doStuffAsync)
    {
        _doStuffAsync = doStuffAsync;
    }

    public async Task DoThatAsyncOperation(string theValue)
    {
        await _doStuffAsync.AnAsyncMethod(theValue);
    }
}

在我的测试中我想检查该方法DoThatAsyncOperation正在使用正确的值调用方法,因此我模拟接口并使用最小起订量来验证调用

    [Fact]
    public async void The_test_will_pass_even_though_it_should_fail()
    {
        var mock = new Mock<IDoStuffAsync>();
        var sut = new UseAnAsyncThing(mock.Object);

        mock.Setup(x => x.AnAsyncMethod(It.IsAny<string>()));

        await sut.DoThatAsyncOperation("test");

        // This won't throw a Moq.MockExcpetion so the test appears to pass
        // However it does not run
        mock.Verify(x => x.AnAsyncMethod("fail"));
    }

本次测试使用的是async and await关键词。当它运行时,它会错误地通过,因为 Moq 应该断言验证失败。调用后的任何代码sut.DoThatAsyncOperation("test");不运行

    [Fact]
    public void This_will_work_and_assert_the_reslt()
    {
        var mock = new Mock<IDoStuffAsync>();
        var sut = new UseAnAsyncThing(mock.Object);

        mock.Setup(x => x.AnAsyncMethod(It.IsAny<string>()));

        sut.DoThatAsyncOperation("test").ContinueWith(y => { });

        // This won't throw a Moq.MockExcpetion so the test appears to pass
        // However it does not run
        mock.Verify(x => x.AnAsyncMethod("fail"));
    }

该测试的设置没有使用await 和async 关键字,并且顺利通过。

这是 xUnit 和 Moq 的预期行为吗?


Update

感谢斯蒂芬的评论,我设法通过进行两项更改来修复第一个测试。测试现在返回一个任务而不是 void,并且模拟也返回一个任务。

    [Fact]
    public async Task The_test_will_pass_even_though_it_should_fail()
    {
        var mock = new Mock<IDoStuffAsync>();
        var sut = new UseAnAsyncThing(mock.Object);

        mock.Setup(x => x.AnAsyncMethod(It.IsAny<string>())).ReturnAsync(true);

        await sut.DoThatAsyncOperation("test");

        // This now fails as it should
        mock.Verify(x => x.AnAsyncMethod("fail"));
    }

更改您的单元测试方法以返回Task代替void,它应该可以工作。支持async void单元测试正在考虑在未来发布 http://xunit.codeplex.com/workitem/9752.

我详细描述一下为什么异步单元测试默认不起作用 http://nitoprograms.blogspot.com/2012/02/async-unit-tests-part-1-wrong-way.html在我的博客上。 (我的博客示例使用 MSTest,但所有其他测试运行程序都存在相同的问题,包括 xUnit 1.9 之前的版本)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xUnit 和 Moq 不支持 async -await 关键字 的相关文章

  • C++:如何检测向量中的重复项并打印一份副本?

    我是 C 新手 我想知道如何在向量中找到重复的字符串并打印出该字符串的一个副本 例如 如果我有它会打印出cat dog bird 我已经对我的向量进行了排序 并使用adjacent find函数并迭代该向量 因为我必须查找是否有任何单词重复
  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • Ajax 函数在重定向后不保存滚动位置

    正如标题所述 我编写了一个 ajax 函数 该函数应该滚动到用户在重定向之前所在的位置 我写了一个alert对于测试场景 它确实触发了 但滚动不断回到顶部 我在这里做错了什么 JavaScript ajax type GET url Adm
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 将华氏温度转换为摄氏度的 C 程序始终打印零

    我需要一些关于用 C 语言将华氏温度转换为摄氏度的程序的帮助 我的代码如下所示 include
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • 如何指示Lucene中的StandardAnalyzer不删除停用词?

    简单问题 如何制作Lucene的StandardAnalyzer在分析我的句子时不要删除停用词 答案取决于版本 为了Lucene 3 0 3 当前 http lucene apache org java 3 0 3 api core org
  • 如何添加链接到 Flash 横幅

    我主要是一名开发人员 不知道如何使用 Adob e Flash CS4 有没有一种简单的方法可以将链接添加到 Flash 横幅 我有 flv 文件 其中包含库和两层中的一些项目 请给我一步一步的指示 编辑 我找到简单的解决方案 步骤如下 G
  • 放置项和对齐项有什么区别?

    想知道使用有什么区别 display flex align items center or display flex place items center 视觉上看起来是一样的 place items 有 90 的浏览器支持 align i
  • 具有 .htaccess 和 mod_rewrite 的静态 HTML 文件的语义 URL

    mod rewrite 总是让我困惑 谁能告诉我获得以下干净 URL 所需的规则 左边是所需的 URL 右边是真实的 URL our work gt our work html our work some project gt our wo
  • 使用 CORS 和 OpenShift 上的节点应用程序通过 POST 清空请求正文

    我正在 OpenShift 上使用 Express 创建一个简单的 Node 应用程序 我只是修改 OpenShift 的默认示例 Node 应用程序 我想要 CORS 支持 var cors require cors Initialize
  • 在Python中计算元音

    def main print count def countVowels string vowel aeiouAEIOU count 0 string input enter a string for i in string if i in
  • 文本区域和超链接?

    我有两个关于 Visual Studio 中的 C 的快速 简单的问题 首先 除了程序中的文本区域之外 是否有类似标签的东西 我想在我的程序中包含多行文本 但似乎只能使用打开自动换行的 DotNetBar 标签来完成它 其次 有没有办法在不
  • 是否存在任何危险,例如使用 pip 的 --ignore-installed 标志导致冲突?

    我无法找到 pip 的良好文档 ignore installed flag pip install help简单地说 忽略已安装的软件包 而是重新安装 除了系统上存在更多问题的副作用之外 因为安装的软件包在升级时不会被卸载 是否还有其他已知
  • PHP 评估 $a="$a"?

    我正在查看一些工作代码 并发现了这一行 eval element element 我真的很困惑为什么 PHP 开发人员会写这行代码 除了为自身设置一个变量之外 这还有什么目的 幸运的是 该行所在的函数从未被调用 上面的例子将输出 This
  • 在 Woocommerce 结帐页面中添加信息丰富的自定义消息

    我有一个基于 WP Woocommerce 的网站 我想告诉我的客户 每当他们在我的商店购买东西时 他们订单的 3 都会捐赠给慈善协会 我想显示根据总数计算的确切金额 例如 总计 150 欧元 5 欧元将被下放等 我该如何管理它 您可以将其
  • > 无法在 /opt/android-sdk-linux 中找到哈希字符串“android-26”的目标

    乌班图16 04 android sdk 位于 opt android sdk linux android home 配置 导出 ANDROID HOME opt android sdk linux opt android sdk linu
  • C++ 中真正的异步文件 IO

    我有一个超快的 M 2 驱动器 有多快 没关系 因为我无论如何也无法利用这个速度 这就是我问这个问题的原因 我有一个需要大量内存的应用程序 太多了 以至于内存装不下 幸运的是 并不是一下子就需要它 相反 它用于保存计算的中间结果 不幸的是
  • AdMob - Android 活动中的更好性能

    我有一个 Android 应用程序 我在其中实现了 AdMob 广告 我的布局代码非常简单 将 AdView 添加到 LinearLayout 中
  • 访问者模式对于动态类型语言有用吗?

    访问者模式允许在不扩展对象类的情况下编写对对象的操作 当然 但为什么不直接编写一个全局函数或静态类来从外部操作我的对象集合呢 基本上 在像 java 这样的语言中 accept 出于技术原因需要方法 但在一种语言中我可以实现相同的设计而无需
  • 替换字符串中最后一次出现的字符[重复]

    这个问题在这里已经有答案了 我有一个像这样的字符串 Position fix dial 我想用转义双引号 替换最后一个双引号 字符串的结果是 Position fix dial 我怎样才能做到这一点 我知道要替换字符串的第一次出现 但不知道
  • Android 阻止将照片保存在 DCIM/公共文件夹中

    我正在开发一个 Android 应用程序 用户单击按钮后可以拍照 这张照片将通过以下方法保存到内部包存储 data data package private String saveToInternalSorage Bitmap bitmap
  • 如何在 sqlalchemy 中执行返回的原始查询

    我有一张桌子Ticket具有id 自动递增 票号 读取序列的触发器 value and date在甲骨文中 我想做以下事情 INSERT INTO TICKET value date values 100 TO DATE 07 29 201
  • 在运行时创建实例变量

    我想在运行时动态创建实例变量 并且想将这些变量添加到类别中 实例变量的数量可能会根据我用于定义它们的配置 属性文件而变化 有任何想法吗 Use 关联参考 http developer apple com library ios docume
  • 从 Angular 访问 webapi 时出现 401 未经授权的错误

    当用户访问我的 webapi 应用程序时 我需要捕获用户的域 用户名 在我的开发机器上 我的 webapi 位于localhost 10570和我的 angularjs 网站 它调用网络服务localhost 34575 如果我直接调用我的
  • xUnit 和 Moq 不支持 async -await 关键字

    我正在尝试探索如何将 async 和 wait 关键字应用到我的 xUnit 测试中 我正在使用 xUnit 1 9 和 Async CTP 1 3 这是我的测试用例 我有一个接口 它指定一个异步方法调用 public interface