即使在返回承诺后也承诺测试时间

时间:2018-02-11 00:00:43

标签: javascript node.js mocha

我研究并发现,在摩卡测试承诺时,你必须回复承诺。

我尝试执行以下操作但测试保持超时。这样做的正确方法是什么?

describe('A promise', () => {

    it('should not timeout', () => {

        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('hi!');
            }, 3000);
        }).then((msg) => {
            expect(msg).to.equal('hi!');
        });

    });

});

输出:

$ ./node_modules/mocha/bin/mocha test.js


  A promise
    1) should not timeout


  0 passing (2s)
  1 failing

  1) A promise
       should not timeout:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

修改:我尝试在done行中添加it并在then块中调用它但不起作用

4 个答案:

答案 0 :(得分:1)

尝试此操作(仅更改:" .timeout(5000)"已添加到"它")。这适合我。基本上你必须更改异步调用的默认超时2秒 - 如果你希望你的异步调用将花费超过2秒。

describe('A promise', () => {
    it('should not timeout', () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('hi!');
            }, 3000);
        }).then((msg) => {
            expect(msg).to.equal('hi!');
        });
    }).timeout(5000);
});

第二个选项(在这种情况下无需更改测试):

./node_modules/mocha/bin/mocha --timeout 5000 test-mocha-spec.js

答案 1 :(得分:0)

这有用吗?

it('should not timeout', done => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('hi!');
        }, 1000);
    }).then((msg) => {
        expect(msg).to.equal('hi!');
        done();
    });
});

答案 2 :(得分:0)

首先,您需要在回调中添加done参数

it('should not timeout', (done) => {

并在最后调用它,

}).then((msg) => {
    expect(msg).to.equal('hi!');
    done()
});

答案 3 :(得分:0)

您有3个选项:

  1. 返回承诺
  2. 使用完成(如果你还返回promise将是错误的 抛出)
  3. 使用async / await
  4. 在所有这些情况下,您必须设置超时阈值,因为mocha无法确定您是否会解决异步调用。这是对无休止测试的保护。

    通常情况下,你需要用一些伪造的价值来伪造你承诺的电话并立即解决一些承诺,这样你就不会有这样的问题。