[英]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.