如何异步构建我的测试套件?

2024-05-27

我正在尝试使用必须异步加载的配置为我的控制器创建摩卡测试。下面是我的代码。但是,当运行摩卡测试时,它不会运行任何测试,显示0 passing. The console.logs 甚至从未被调用过。我尝试做before(next => config.build().then(next))在描述里面,但即使测试运行,before从未被调用过。有没有一种方法可以在运行任何测试之前加载一次配置?

'use strict';

const common = require('./common');
const config = require('../config');

config
    .build()
    .then(test);


function test() {
console.log(1);
    describe('Unit Testing', () => {
console.log(2);
        require('./auth');
    });
}

你应该运行 Mocha--delay选项,然后使用run()一旦你完成了测试套件的构建。这是从您在问题中显示的代码派生的示例:

'use strict';

function test() {
    console.log(1);
    describe('Unit Testing', () => {
        console.log(2);
        it("test", () => {
            console.log(3);
        });
    });

    // You must use --delay for `run()` to be available to you.
    run();
}

setTimeout(test, 1000);

我在用着setTimeout模拟异步操作。使用--delay and run()允许您构建一个异步计算结果的套件。但请注意,该套件必须一次性构建。 (你不能在里面有一个异步进程describe这将拨打电话it。这行不通。)


rob3c 绝对不应该做的一件事是suggests https://stackoverflow.com/a/48572080/1906307: 打电话describe or it(或两者)从钩子内部。这是人们时常犯的错误,因此值得详细解决。问题是 Mocha 不支持它,因此没有与调用相关的既定语义describe or it从钩子里面。哦,可以编写简单的示例来按预期工作,但是:

  1. 当套件变得更加复杂时,套件的行为不再对应于任何明智的行为。

  2. 由于没有与此方法相关的语义,因此较新的 Mocha 版本可能会以不同的方式处理错误的使用并破坏您的套件。

考虑这个简单的例子:

const assert = require("assert");

const p = Promise.resolve(["foo", "bar", "baz"]);

describe("top", () => {
    let flag;
    before(() => {
        flag = true;
        return p.then((names) => {
            describe("embedded", () => {
                for (const name of names) {
                    it(name, () => {
                        assert(flag);
                    });
                }
            });
        });
    });

    after(() => {
        flag = false;
    });

    it("regular test", () => {
        assert(flag);
    });
});

当我们运行它时,我们得到:

  top
    ✓ regular test

  embedded
    1) foo
    2) bar
    3) baz

  1 passing (32ms)
  3 failing

  // [stack traces omitted for brevity]

这里发生了什么?不是所有的测试都应该通过吗?我们设置flag to true in the before钩子top描述。我们在其中创建的所有测试都应该看到flag as true, 不?线索在上面的输出中:当我们在钩子中创建测试时,Mocha 会将测试放入某处但它可能不在反映结构的位置describe代码中的块。会发生什么在这种情况下是 Mocha 只是将钩子中创建的测试附加到套件的最后,在top描述,所以afterhook 在动态创建的测试之前运行,我们得到了一个违反直觉的结果。

Using --delay and run(),我们可以编写一个行为符合直觉的套件:

const assert = require("assert");

const p = Promise.resolve(["foo", "bar", "baz"]).then((names) => {
    describe("top", () => {
        let flag;
        before(() => {
            flag = true;
        });

        after(() => {
            flag = false;
        });

        describe("embedded", () => {
            for (const name of names) {
                it(name, () => {
                    assert(flag);
                });
            }
        });

        it("regular test", () => {
            assert(flag);
        });
    });
    run();
});

Output:

  top
    ✓ regular test
    embedded
      ✓ foo
      ✓ bar
      ✓ baz


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

如何异步构建我的测试套件? 的相关文章

随机推荐

  • c++11 为什么这个移动构造函数不起作用?

    我已经编写了下面发布的代码 我希望能够在实例之间移动向量的内容LargeClass 正在使用移动构造函数 但我只得到副本而不是移动 为什么移动语义在这里没有按预期工作 Code include
  • Git 会删除空文件夹吗? [复制]

    这个问题在这里已经有答案了 我已提交一个项目并将其推送到我的 GitHub 帐户 该项目包含以下部分文件结构 server conf some files java lib java 和 lib 文件夹为空 从 GitHub 下载我的项目时
  • 在 C++ 中返回对象的最佳方法?

    我对 C 很菜鸟 返回对象的更好方法是什么 我来自脚本世界 其中对象始终是引用 并且正在尝试实现相同的概念 我的基础是C 中什么时候通过引用传递 什么时候通过指针传递 https stackoverflow com questions 36
  • Git Push 远程:致命:包超出允许的最大大小

    我接到了一个大项目 客户想将其添加到github 我是一点一点添加的 然后发生的事情是我太贪心了 一次添加了太多文件 现在 无论我尝试什么 我都会不断收到此错误 我怎样才能解决这个问题 我试图回滚 但也许我做错了 git push Ente
  • 为一个对象上的每个元组元素调用函数,无需递归

    我有一个类对象A可以用不同的类型调用 并在每次调用时返回更改后的 self 为了这个问题的目的A will do struct A A call const int A call const string s a 所以我有一个未知类型的元组
  • 可以让 ReSharper 在 Intellisense 中显示异常吗?

    我很喜欢 ReSharper 提供的重写智能感知行为 但是 我似乎无法让它显示异常 任何带有
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 在 C 中使用 lapack 计算矩阵的逆

    我希望能够计算一般的逆NxN使用 lapack 在 C C 中编写矩阵 我的理解是 在 lapack 中进行反转的方法是使用dgetri函数 但是 我无法弄清楚它的所有参数应该是什么 这是我的代码 void dgetri int N dou
  • createElement variable2

    我需要在 SharePoint 2010 中创建导航 Web 部件 我使用表格来显示 SharePoint 列表中的项目 该表格的结构如下 Column1 要显示的文本 标题 第 2 列 URL 标题链接 我似乎无法弄清楚如何实现创建 a
  • 我可以在 Orchard CMS 中使用我的 Ninject .NET 项目吗?

    我正在使用 Orchard CMS 创建一个网站 并且有一个用 Ninject 编写的外部 NET 项目 用于依赖注入 我想将其与 Orchard CMS 中的模块一起使用 我知道 Orchard 使用 Autofac 进行依赖注入 这给我
  • Nodejs 上使用 DNS 进行 Consul 服务发现

    TL DR 大家好 我试图从用 Express 编写的 NodeJS 前端调用 NodeJS 后端微服务 通过Consul https www consul io DNS接口 https www consul io intro gettin
  • 将 StringBuilder 写入 Stream

    将 StringBuilder 写入 System IO Stream 的最佳方法是什么 我目前正在做 StringBuilder message new StringBuilder All your base message Append
  • 如何在 X 秒后更改 NSTimer 的 NSTimeInterval?

    我正在 swift 2 中制作一个应用程序 其中有两个计时器 10 秒后我希望另一个计时器走得更快 我尝试过这样做 但它不起作用 我正在尝试更改 vartime to 1 IBOutlet var displayTimeLabel UILa
  • 如何在Shiny中默认选择verbatimTextOutput中的文本?

    这是与我之前的问题相关的问题 是否可以有固定宽度的 verbatimTextOutput 并让文本在 Shiny 中换行 https stackoverflow com q 58516071 7669809 我有以下闪亮的应用程序 http
  • navigator.geolocation.getCurrentPosition 在 Android 浏览器上失败

    我试图在 Android 浏览器上获取地理位置 但没有任何反应 我使用的是 Samsung Galaxy S3 但我不确定浏览器的版本 安卓版本是4 1 2 这是我的代码 if navigator geolocation var timeo
  • Xcode Instruments:模拟器中运行的 iPhone 应用程序的峰值 RAM?

    活动监视器 又名内存监视器 是 Xcode Instruments 中唯一可以测量在模拟器中运行的 iPhone 应用程序的总应用程序 RAM 使用情况的工具吗 只是显示瞬时有线 RAM 的那条线 与 iPhone 硬件相比 尤其是 OSX
  • 此应用程序的包标识符与其代码签名标识符不匹配

    当我尝试在设备上构建并运行应用程序时 出现以下错误App installation failed This application s bundle identifier does not match its code signing id
  • PHP facebook SDK 4.0登录错误

    我正在官方页面上寻找文档 但没有任何帮助 所以我构建了此代码 但它不起作用 FacebookSession setDefaultApplication app id app secret helper new Facebook Facebo
  • 无法在 Office365 REST Api 中检索附件的“ContentId”属性

    我正在尝试检索 Office365 Rest api 中的附件 由于我想避免下载整个附件 因此我使用 select 子句来避免下载 ContentBytes 属性中的内容 select ContentId ContentType Id Is
  • 如何异步构建我的测试套件?

    我正在尝试使用必须异步加载的配置为我的控制器创建摩卡测试 下面是我的代码 但是 当运行摩卡测试时 它不会运行任何测试 显示0 passing The console logs 甚至从未被调用过 我尝试做before next gt conf