当前位置: 首页 > 面试题库 >

如何异步构建测试套件?

翁鸿远
2023-03-14
问题内容

我正在尝试使用必须异步加载的配置为我的控制器创建摩卡测试。下面是我的代码。但是,运行mocha测试时,它不会运行任何测试,显示为0 passing。该console.logs的甚至从来没有叫。我尝试before(next => config.build().then(next))在describe内执行操作,但是即使运行测试,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');
    });
}

问题答案:

您应该使用--delay选项运行Mocha ,然后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用来模拟异步操作。使用--delayrun()允许您构建作为异步计算结果的套件。但是请注意,套件必须一次性构建。(您不能在内部使用异步进程describe进行调用it。这将无法工作。)

你绝对不应该做的一件事就是rob3c的建议:从一个钩子内部调用describeit(或两者)。这是每个人不时犯的错误,因此值得详细解决。问题是Mocha不支持它,因此没有与调用describeit挂钩内部相关的已建立语义。哦,有可能写一些简单的示例,这些示例可以按预期工作,但是:

  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]

这里发生了什么?所有的测试不应该通过吗?我们设置flagtruebefore钩的top描述。我们在其中创建的所有测试都应该显示flagtrue,否?线索就在上面的输出中:当我们在一个钩子中创建测试时,Mocha会将测试
放在某个地方, 但是它可能不在反映describe代码中块结构的位置。 在这种情况下
,发生的事情是Mocha只是将在钩子中创建的测试附加到套件的末尾,而不是topdescribe的末尾,因此该after钩子在动态创建的测试之前运行,并且我们得到了违反直觉的结果。

使用--delayrun(),我们可以编写一个行为与直觉一致的套件:

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();
});

输出:

  top
    ✓ regular test
    embedded
      ✓ foo
      ✓ bar
      ✓ baz


  4 passing (19ms)


 类似资料:
  • 用mocha测试一个函数是非常简单的,但是,在JavaScript的世界中,更多的时候,我们编写的是异步代码,所以,我们需要用mocha测试异步函数。 我们把上一节的hello-test工程复制一份,重命名为async-test,然后,把hello.js改造为异步函数: const fs = require('mz/fs'); // a simple async function: module

  • 全部: 我对Jasmine测试非常陌生,我想知道的一个关于异步测试的问题是: 有谁能简单解释一下Jasmine是如何知道里面有一个done()函数调用并等待它完成的? 例如,如果我把一些异步调用在之前: Jasmine怎么知道它应该让规范测试等待? 谢谢

  • 假设我有10个spring boot test类(用@runwith(springrunner.class)和@springboottest注释) 每个测试需要启动spring容器大约10秒,尽管容器可能会执行相同的init。 所以我可能需要100秒进行“MVN测试”。 null

  • 问题内容: 任何人都可以告诉我如何在安装调用组件时开玩笑地等待一个模拟的诺言解决吗? 将在我的笑话嘲笑测试 然后是我的测试文件: 问题是我正在返回,因为尚未进行模拟的api调用和生命周期方法。 问题答案: Jest有模拟假冒时间旅行的方法,要在您的情况下使用它,我想您可以按照以下样式更改代码: 另外,您也可以使用

  • import { QuoteComponent } from './quote.component'; import { provide } from '@angular/core'; import { async, TestBed, fakeAsync, tick, } from '@angular/core/testing'; class MockQuoteService {

  • 异步模块 异步模块与同步模块相反,指的是模块是在运行时才去异步加载然后再运行。 setTimeout(function(){ // 异步模块`async.js`在 1000ms 后加载,然后再运行 require.async('async.js', function(exports){ // 模块加载完成后,返回模块的导出 // exports