我正在使用 Typescript,使用 Mocha 并尝试使用 ES6 异步/等待生成器。
这是我的代码:
"use strict";
import * as console from 'console';
import { Config } from './Config';
import * as assert from 'assert';
import * as mocha from 'mocha';
import fetch from 'node-fetch';
async function createExchangeRate(date: string) {
let body = JSON.stringify({
'ts': date,
'gbptoUSD': 1.0,
'eurtoUSD': 1.0,
'cyntoUSD': 1.0
});
return fetch(`${Config.host()}/exchangeRate`, { method: 'POST', body: body });
}
describe('/exchangeRate', function() {
let date = '2016-01-01';
it('creates the exchange rate', async function(done) {
let response = await createExchangeRate(date);
console.log('Got my promise!');
let body = await response.json();
assert.equal(response.status, 204);
assert.ok(body.uuid);
done();
});
});
一切都正确编译,但是 createExchangeRate
返回的 promise 似乎从未得到解决,并且从未达到 console.log
。
最终,Mocha 测试超时,我收到类似于以下内容的消息:
Error: timeout of 5000ms exceeded. Ensure the done() callback is being called in this test.
我尝试了一系列不同的格式,但看不出哪里出错了...
更新
如果我重构我的测试以删除 async/await 关键字,它会起作用:
it('creates the exchange rate', () => {
createExchangeRate(date).then(function(response) {
expect(response.status).to.equal(204);
response.json().then(function(body) {
expect(body.uuid).to.be.ok;
});
});
});
最佳答案
createExchangeRate
上的 async
不是必需的(尽管我认为它实际上并没有什么坏处)。 async 关键字允许您使用 await
(您不是)并使您的函数返回一个 promise(当您返回 fetch()
时您已经在做) .
此外,重构后的额外测试不起作用!它执行一些异步操作,但不等待响应。除非您告诉它,否则 Mocha 对 promise 一无所知,因此一旦 createExchangeRate 返回(即立即在请求返回之前),Mocha 就认为您的测试成功了。如果您在每个阶段返回 promise(return createExchangeRate(...
和 return response.json(...
) 那么它就会按照您的预期进行。
更重要的是,您在 mocha 中混合了两种处理异步的方法,即 done
和 promises。如果你添加一个 done 参数,Mocha 会等到你调用它。如果你返回一个 promise,Mocha 会等到 promise 解决。您只想执行其中一个,我认为尝试同时执行这两个操作可能会给您带来一些问题。
如果您不包含 done 参数,并且您的测试返回一个 promise (因为异步函数会自动执行),那么一切都可能会正常进行。就个人而言,我会将您的测试编写为:
describe('/exchangeRate', function() {
let date = '2016-01-01';
it('creates the exchange rate', async function() {
let response = await createExchangeRate(date);
console.log('Got my promise!');
let body = await response.json();
assert.equal(response.status, 204);
assert.ok(body.uuid);
});
});
关于javascript - 使用 Typescript 异步进行 Mocha API 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40718127/