簡體   English   中英

使用Typescript異步進行Mocha API測試

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM