我习惯于使用像这样的标准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()调用之外打这个电话
我如何使其工作?
和请不推荐柴。我想使用标准的断言库
答案 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
块中调用它。