.NET core 使用 Xunit + Autofixture + Moq 编写更好的单元测试

2024-02-16

在 .NET Core 中进行单元测试,我使用 Xunit、Moq 和 Autofixture。但即使有了它们,我发现我的单元测试变得复杂并且需要时间。

也许有人可以告诉我是否有任何方法可以缩小这个测试的规模?

[Fact]
public async Task Verify_NotAuthorised_NoServiceSendInvoked()
{
    // Arrange
    var fixture = new Fixture()
        .Customize(new AutoMoqCustomization());

    var sut = fixture.Create<VerificationService>();

    var mockApiBuilder = fixture.Freeze<Mock<IApiEntityBuilder>>();
    //init mocked mockSendServiceOne, so later I could check if it was invoked or not
    var mockSendServiceOne = fixture.Freeze<Mock<ISendServiceOne>>();

    mockApiBuilder.Setup(x => x.Verification(It.IsAny<string>(), It.IsAny<string>()))
        .Returns(fixture.Create<VerificationEntity>());

    var call = fixture.Freeze<Mock<ISendServiceTwo>>();
    call.Setup(x => x.IsSuccessful()).Returns(false);

    // Act
    await sut.Verify(fixture.Create<string>(), fixture.Create<string>());

    // Assert
    mockSendServiceOne.Verify(x => x.Call(It.IsAny<SendServiceOneEntity>()), Times.Never);
}

测试方法本身

public async Task<CreatedEntity> Verify(string dataOne, string dataTwo)
{
   await _someCaller.Call(_apiEntityBuilder.Verification(dataOne, dataTwo));
   _someCaller.CreatePayment();

   if (!_someCaller.IsSuccessful()) return _someCaller.CreatedEntity;

   await mockSendServiceOne.Call(_apiEntityBuilder.Call(_someCaller.CreatedEntity.SpecificData));

   return _someCaller.CreatedEntity;
}

在这里,我正在测试 isSuccessful() 返回 fasle,则不应调用 mockSendServiceOne.Call。

有人可以给我一些关于如何编写更好的单元测试的反馈吗? 因为仅仅为了这个小的代码检查,我就必须编写大量代码来测试它。


您可以使用自动数据理论 https://blog.ploeh.dk/2010/10/08/AutoDataTheorieswithAutoFixture/。 (链接到 Mark Seeman 关于这种具体情况的精彩帖子)。

简而言之,AutoFixture 有一个内置属性,称为AutoData您可以继承它,然后使用 AutoMoqCustomization 自定义夹具。

您用此属性装饰您的测试方法([理论]),现在自动修复将自动生成您为测试方法指定的任何参数。

当你会使用Freeze()方法来生成一个项目,你把[Frozen]参数前面的属性。

以下是如何执行此操作的示例:

public class TheTests
{
    [Theory]
    [AutoDomainData]
    public void Verify_WhatWeWannaTest_CallsTheMethodOnTheDependency([Frozen] Mock<ITheDependency> dependency, WhatWeWannaTest sut)
    {
        // Act
        sut.CallTheDependency();

        // Assert
        dependency.Verify(x => x.TheMethod());
    }
}

// Create a AutoData attribute customized with Moq
public class AutoDomainDataAttribute : AutoDataAttribute
{
    public static IFixture FixtureFactory()
    {
        var f = new Fixture();
        // I like members of interfaces to be configured, so i set it her
        f.Customize(new AutoMoqCustomization { ConfigureMembers = true });
        return f;
    }

    public AutoDomainDataAttribute() : base(FixtureFactory) { }
}

// Simple class we can test
public class WhatWeWannaTest
{
    private readonly ITheDependency _theDependency;

    public WhatWeWannaTest(ITheDependency theDependency) { _theDependency = theDependency; }

    public void CallTheDependency()
    {
        _theDependency.TheMethod();
    }
}

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

.NET core 使用 Xunit + Autofixture + Moq 编写更好的单元测试 的相关文章

随机推荐

  • 如何为 if 和 while 语句编写简单的解析器? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要编写一个简单的解析器 将标记转
  • 无法获取 BatchedBridge,请确保您的捆绑包正确打包

    我在 Android 中使用 React Native 时遇到问题 无法获取 BatchedBridge 请确保您的捆绑包正确打包 在此处输入图像描述 1 1 我尝试了一切 将 npm react native react 和 packag
  • Oracle Entity Framework 提供程序不存储包含毫秒的 DateTime.Now

    我基本上和这个人有完全相同的问题 为什么我无法使用实体框架保存当前的 DateTime Now https stackoverflow com questions 18557546 why i cant save the current d
  • R 中的点计数

    假设我从 40 个 x y 对创建以下图片 现在给出黑色的附加点 我希望能够计算出有多少点落在蓝色区域内 有多少点落在蓝色区域之外 以一种非常有效的方式 因为我将在一个昂贵的循环中多次执行此操作 为了说明我正在寻找的内容 请考虑下图 所以正
  • SignalR:如何停止在页面重新加载时创建新连接

    您好 我正在开发一个聊天应用程序以及应用程序中的一些其他页面 一旦我登录 我就会维护用户的会话 我的主要目的是 每当其他用户连接到服务器时 用户应该收到通知 我面临的问题是每当我导航到应用程序中的其他页面时 连接就会丢失 如何停止此行为并继
  • 子类中抛出异常的标准是什么

    到目前为止我所知道的是 子类如果重写超类方法应该抛出相同的异常或异常的子类 例如 这是对的 class SuperClass public int doIt String str Integer data throws ArrayIndex
  • 在 Rails 模型中编写大型 SQL 的更好方法?

    使用了很多之后Arel that Rails提供糖代码 我遇到问题时 处理大型且复杂的 SQL 查询 但我无法很好地处理Arel方法 我喜欢Arel对于小事情 但是当事情变得混乱时 我更喜欢将代码分开 那么 对于我应该如何治疗我的大 有什么
  • ES2015/2016 'typeof varName === 'undefined` 的方式?

    我现在正沉迷于 ES2015 的豪华体验中 有几个项目 我想知道我是否可以摆脱令人讨厌的拐杖来检查undefined在新仙境里 有没有更短但仍然准确的方法typeof varName undefined ES2015 已经有了 我当然可以使
  • 当您在浏览器中输入 URL 时会发生什么[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有人可以告诉我 从我在浏览器中输入 URL 到我在浏览器上看到该页面 幕后发生了什么 详细说明该过程将会有很大帮助 注意 这是一个非常粗糙和过于简单化
  • Boost Log 更改默认logging::core 格式化程序?

    我正在使用 Boost v1 54 我想简单地更改logging core的默认接收器格式 但还没有找到方法 在里面日志记录格式 http www boost org doc libs 1 54 0 libs log doc html lo
  • 嵌套异常是 java.sql.SQLException:无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序 - Spring MVC JNDI 问题

    我正在开发 SpringMvcJndiDataSourceXML 示例 在此示例中 我面临以下错误 我找到了很多链接 但没有一个对我有用 虽然这是重复的问题 但我仍然想得到以下问题的答案 请指导 org springframework jd
  • javascript 命名函数表达式 - 范围可访问性[重复]

    这个问题在这里已经有答案了 我正在跟进John Resig 的 JS 忍者秘密幻灯片 http ejohn org apps learn 11我发现了一些我不太明白的东西 下面的代码定义了一个命名函数表达式 var ninja functi
  • 如何在KONG中实现外部身份验证?

    我在用着KONG API网关 https konghq com 并且我想将 JWT 身份验证实现为单独的微服务 不使用 KONG 插件 现在我可以轻松地使用 KONG 注册此服务 以便用户可以注册和登录 假设经过身份验证的用户发送了一个请求
  • 将 MS Office Communicator 状态指示器添加到 JSP 中

    我想将 MS Office Communicator 状态指示器添加到我的 Java 应用程序 jsp 中 如果您的目标是 Windows 平台 最简单的方法是在客户端完成所有操作 只要客户端运行 IE Office 2003 或更高版本以
  • 当输入句子没有标点符号时使用的句子分割工具(已标准化)

    假设有一个类似 给我找一些爵士音乐并播放它 的句子 其中所有文本都已标准化并且没有标点符号 语音识别库的输出 除了连接词分割的简单方法之外 还有哪些在线 离线工具可用于进行 句子分割 Input 给我找一些爵士乐并播放 Output 给我找
  • 如何在node.js中生成PDF

    我想生成一个模块 该模块将通过将输入作为我的发票来生成 PDF 并且该 PDF 文件会自动发送给客户的邮件 ID 在第一步中 我得到了一些代码并尝试生成 PDF 该代码工作正常 我能够生成 PDF 但我无法打开该文件 对于代码 我使用此链接
  • 调试应用程序中的巨大内存泄漏

    我的应用程序刚刚泄漏了 1 5GB 内存 我想因为我没有大量可用的数据 所以我假设它泄漏了内存 但它也可能只是保留它 我目前正在使用 perfmon 收集尽可能多的信息 以尝试了解可能导致问题的原因 目前我没有太多线索 希望能从这里的人们那
  • 检查xml节点是否存在?

    我想检查给定的节点是否存在 xml文件 我尝试 string language node SelectSingleNode language null node SelectSingleNode language Value en en U
  • NetBeans + 多个 php 版本 + 没有 PEAR 的 phpUnit

    我的问题有点复杂 我在 IIS 上有多个 php 版本 每个php项目都有自己的php版本和域名 例如 www webshop loc 我正在通过NetBeans开发项目 并且我想使用TDD作为开发过程 我的问题是 如何在不安装 PEAR
  • .NET core 使用 Xunit + Autofixture + Moq 编写更好的单元测试

    在 NET Core 中进行单元测试 我使用 Xunit Moq 和 Autofixture 但即使有了它们 我发现我的单元测试变得复杂并且需要时间 也许有人可以告诉我是否有任何方法可以缩小这个测试的规模 Fact public async