如何构造异步功能的测试?

时间:2019-03-19 02:58:18

标签: javascript async-await mocha assert

我习惯于使用像这样的标准NodeJs assert 库编写Mocha测试:

describe('Some module', () => {
   var result = someCall();
   it('Should <something>', () => {
      assert.ok(...);
   });
})

但是现在我的电话返回了一个承诺...所以我要写:

describe('Some module', async () => {
   var result = await someCall();
   it('Should <something>', () => {
      assert.ok(...);
   });
})

但是它不起作用。我的测试根本没有运行。奇怪的是,

describe('Some module', async () => {
   it('Should <something>', () => {
      var result = await someCall();
      assert.ok(...);
   });
})

工作正常,但问题是我想打一个电话并对它进行很多测试,所以我想在it()调用之外打这个电话

我如何使其工作?

不推荐柴。我想使用标准的断言库

3 个答案:

答案 0 :(得分:3)

尽管在使用中有些非常规,但一种方法可能是使用before() hook来达到您的要求。

在套件中的其余测试之前,before()钩子将提供一种调用功能(即someCall())的方法。挂钩本身支持通过回调函数(即done)执行异步功能,一旦完成异步功能,就可以调用该回调函数:

before((done) => {
  asyncCall().then(() => {
    /* Signal to the framework that async call has completed */
    done(); 
  });
});

将其与现有代码集成的一种方法如下:

describe("Some module", () => {
  /* Stores result of async call for subsequent verification in tests */
  var result;

  /* User before hook to run someCall() once for this suite, and
  call done() when async call has completed */
  before((done) => {
    someCall().then((resolvedValue) => {
      result = resolvedValue;
      done();
    });
  });

  it("Should <something>", () => {

    /* result variable now has resolved value ready for verification */
    console.log(result);
  });
});

希望有帮助

答案 1 :(得分:3)

before接受async函数,因此您可以在测试运行之前获取result并在测试中使用它,如下所示:

const assert = require('assert');

const someCall = () => Promise.resolve('hi');

describe('Some module', () => {
  let result;

  before(async () => {
    result = await someCall();
  });

  it('Should <something>', () => {
    assert.equal(result, 'hi');  // Success!
  });
});

答案 2 :(得分:1)

摩卡咖啡已经支持您想做的事。

Mocha的describe函数并非旨在异步工作。但是,it函数被设计为通过传递done回调(实际参数名称可以是诸如“ complete”或“ resolve”或“ done”之类的东西)来异步工作,并返回一个promise或传递async函数。

这意味着您的测试 几乎 是正确的。您只需要这样做:

describe('Some module', () => {
   it('Should <something>', async () => {
      var result = await someCall();
      assert.ok(...);
   });
})

如果您需要为多个someCall()块运行一次it函数,则可以按照其他答案中的说明进行操作,并在before块中调用它。