如何参数化 xunit 类装置?

2024-01-31

xUnit 提供了(共享)类装置的概念,如中所述测试之间共享上下文 https://xunit.net/docs/shared-context。到目前为止我还没有弄清楚是否有一种方法可以对此类装置进行参数化。例如,如果DatabaseFixture应该用一些测试数据来丰富,这取决于它所运行的测试?测试类可能想要插入测试数据,但仅once然后针对该数据库(夹具)运行所有测试。

换句话说,如果// ... initialize data in the test database ...从文档(上面引用)还取决于测试?因为并非所有测试都希望拥有相同的测试数据。实际上,我什至认为很多时候测试定义自己的测试数据而不是在测试数据级别上耦合测试是一种很好的做法。

就解决方法而言我正在做的是提供ConfiguredWith接受仅执行一次的回调的方法。为此,我需要延迟测试数据库的初始化,以便确保配置选项已设置。就像是:

public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
    DatabaseFixture fixture;

    public MyDatabaseTests(DatabaseFixture fixture)
    {
         this.fixture = fixture;
         this.fixture.ConfigureWith(new DatabaseFixtureOptions
         {
             InitTestData = db => db.Insert(...);
         };
    }

    // ... 
}

对于针对数据库编写测试时感觉像是标准要求的东西来说,这看起来相当人为。

如果 xUnit 不提供开箱即用的功能,也许有人有更好的模式来解决这个问题。

这个问题 https://stackoverflow.com/questions/28211431/are-there-parameterized-test-fixtures-for-xunit似乎朝着类似的方向发展,但我不一定固定在具有该结构的解决方案上。


我学到了尝试共享实体框架数据库上下文的艰难方法IClassFixture or CollectionFixtures由于 xUnit 的并行执行,最终会导致测试被另一个测试数据污染或死锁/竞争条件,实体框架会抛出异常,因为它已经使用给定的 Id 跟踪该对象,还有更多类似的麻烦。 就我个人而言,我建议针对您的特定使用原因,将数据库上下文创建/清理放在constructor/dispose替代方案例如:

    public class TestClass : IDisposable
    {
        DatabaseContext DatabaseContext;

        public TestClass()
        {
            var options = new DbContextOptionsBuilder<DatabaseContext>()
              .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
              .Options;

            DatabaseContext = new DatabaseContext(options);

            //insert the data that you want to be seeded for each test method:
            DatabaseContext.Set<Product>().Add(new Product() { Id = 1, Name = Guid.NewGuid().ToString() });
            DatabaseContext.SaveChanges();
        }

        [Fact]
        public void FirstTest()
        {
            var product = DatabaseContext.Set<Product>().FirstOrDefault(x => x.Id == 1).Name;
            //product evaluates to => 0f25a10b-1dfd-4b4b-a69d-4ec587fb465b
        }

        [Fact]
        public void SecondTest()
        {
            var product = DatabaseContext.Set<Product>().FirstOrDefault(x => x.Id == 1).Name;
            //product evaluates to => eb43d382-40a5-45d2-8da9-236d49b68c7a
            //It's different from firstTest because is another object
        }

        public void Dispose()
        {
            DatabaseContext.Dispose();
        }
    }

当然你总是可以做一些改进,但想法就在那里

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

如何参数化 xunit 类装置? 的相关文章

随机推荐

  • 指向匿名结构的 C 指针

    有没有办法获取指向匿名结构的指针 如果没有匿名结构 我可以编写以下内容 struct a int z struct b int y struct a x 这工作正常 但我只使用struct a within struct b用它来污染全局命
  • 正则表达式搜索 C++

    include
  • 将列添加到 SQL 查询结果

    我正在 SSRS 中整理一份报告 该数据集由 MS SQL 服务器的 SQL 查询填充 它使用 Union All 查询几个相似的表 问题是存在一些信息丢失 不同的表对应不同的工作地点 但这些表中没有一列包含该地点的名称 识别站点的唯一方法
  • Vue中,template、render、VNode是什么关系?

    在开发vue项目的过程中 遇到一些疑问template render VNode 阅读文档后https v2 vuejs org v2 guide syntax html https v2 vuejs org v2 guide syntax
  • 如何从 Yahoo! 抓取关键统计数据使用 R 进行财务? [复制]

    这个问题在这里已经有答案了 不幸的是 我还不是一个经验丰富的爬虫 然而 我需要使用 R 从雅虎财经抓取多只股票的关键统计数据 我对使用 rvest 包中的 read html html nodes 和 html text 直接从 html
  • 内嵌文本 - 带填充的背景颜色

    我需要制作一个背景颜色不是块的标题 只有文本背景是彩色的 Here is an image of what I have to archieve 这是我到目前为止所得到的 http jsbin com tiwuquze 1 edit htt
  • Textmate 中的自动完成

    有时我会观看有人使用文本伴侣的屏幕截图 我是一名 Rails 开发人员 所以这些是 Rails 屏幕截图 他们会输入如下内容 def 例如 并且 end 会自动出现在下面 我确实启用了 Rails 捆绑包 为什么我没有发生这种情况 Than
  • 使用 R 绘制二次回归线

    我对 R 很陌生 而且对 R 也很陌生plotly 我正在尝试绘制二次 即二次多项式 回归线 一旦一些价格与年份 以及相同的价格与某些整数列表 可以相同 比方说分数 本例中的数据是 price c 995 675 690 600 612 7
  • 如何强制 r optim 运行更多迭代?

    R Optim 比我想要的更早停止迭代 我使用 method L BFGS B 因为我需要不同参数的不同界限 我知道我可以通过 control gt maxit 设置最大迭代次数 但 optim 没有达到最大值 我想 control gt
  • Emacs - Ubuntu 初始化

    在 ubuntu 上加载 emacs 的行为很奇怪 似乎发生了一些初始化 这些初始化不在 emacs 中 也不在 emacs 报告通过 emacs debug init 加载的任何文件中 我发现了一些与字体相关的调整大小的参考 但这种行为似
  • 依赖注入架构设计——服务类循环引用

    我有以下服务类别 public class JobService private UserService us public JobService UserService us this us us public void addJob J
  • Objective C - 访问 zip 中的文件而不解压 zip

    我正在寻找一种访问 zip 文件中的文件而不提取整个文件的方法 我在互联网上找到的所有 zip 解决方案似乎都提取了整个 zip 有谁知道解决方案吗 Google 有一个基于 minizip 的 Objective C 库 http cod
  • 如何从事件中删除所有事件处理程序?

    我有以下课程 Public Class SimpleClass Public Event SimpleEvent Public Sub SimpleMethod RaiseEvent SimpleEvent End Sub End Clas
  • 如何处理 csv 列表中的单词[重复]

    这个问题已经存在了 我遇到了基于以下程序的问题 Code Download the helper library from https www twilio com docs python install import os from tw
  • 如何使用 python 的 cassandra-driver 将地图类型插入 cassandra

    因为 cassandra 支持地图类型 我想将 python 字典插入 cassandra 中 我试过这个 cql Insert into table name my key name my dict values s s s my key
  • 具有水平滚动功能的 SVG

    我正在尝试用 D3 制作 SVG 图表 https cdnjs cloudflare com ajax libs d3 3 5 17 d3 min js https cdnjs cloudflare com ajax libs d3 3 5
  • jQuery 延迟方法和 ajax beforeSend()

    通过使用 ajax 中的延迟对象 成功回调可以替换为deferred method done 错误回调 acn 替换为deferred method fail 完整回调可以替换为always 通过使用 var jqxhr ajax url
  • Android 和 BouncyCastle 的 IllegalAccessError

    我正在尝试实现时间戳请求 如下所示 http bouncy castle 1462172 n4 nabble com Timestamp request and response td1558231 html http bouncy cas
  • Flask 中 AJAX 身份验证的 CSRF 保护

    我想在网站上使用 AJAX 化登录和注册表单 到目前为止 我一直使用 WTForms 主要是为了它内置的 CSRF 保护 但对于这个项目 我觉得不值得 额外的抽象层 因此令人沮丧 对于一些应该漂亮的东西简单的 所以我遇到了这个片段 http
  • 如何参数化 xunit 类装置?

    xUnit 提供了 共享 类装置的概念 如中所述测试之间共享上下文 https xunit net docs shared context 到目前为止我还没有弄清楚是否有一种方法可以对此类装置进行参数化 例如 如果DatabaseFixtu