[英]Mocha API testing with Typescript async
我正在使用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测试超时,并且我收到类似以下消息:
错误:超过5000毫秒的超时。 确保此测试中调用了done()回调。
我尝试了多种不同的格式,但看不到我要去哪里错了...
UPDATE
如果我重构测试以删除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
中没有await
关键字。 因此,此功能不是async
。 删除前面的async
关键字,它应该可以正常工作。
不需要在createExchangeRate
上进行async
(尽管我认为这实际上并没有带来任何伤害)。 使用async关键字,您可以使用await
(不是),并使函数返回一个promise(在返回fetch()
时已经在执行此操作)。
另外,重构后的额外测试无法正常进行! 它执行一些异步操作,但不等待响应。 除非您告知承诺,否则Mocha不会对承诺一无所知,因此,一旦createExchangeRate返回(即立即,在请求返回之前),Mocha就会认为您的测试成功。 如果您在每个阶段都返回承诺( return createExchangeRate(...
和return response.json(...
)),那么它将按照您的期望进行。
更重要的是,您正在混合两种在Mocha中处理异步的方式,既done
又承诺。 如果添加完成参数,则Mocha会等到调用它。 如果您返回承诺,则摩卡咖啡会等到该承诺解决为止。 您只想做其中之一,我认为尝试两者都在给您带来一些问题是合理的。
如果您不包括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);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.