Javascript 使用Typescript async进行Mocha API测试

Javascript 使用Typescript async进行Mocha API测试,javascript,typescript,ecmascript-6,async-await,Javascript,Typescript,Ecmascript 6,Async Await,我正在使用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 c

我正在使用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
返回的承诺似乎从未得到解决,也从未到达
控制台.log

最终,摩卡咖啡测试超时,我得到一个类似的信息:

错误:超过5000毫秒的超时时间。确保正在执行done()回调 在这次测试中被调用

我尝试了一系列不同的格式,但看不出哪里出了问题

更新

如果我重构测试以删除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
中没有
wait
关键字。因此,此函数不是异步的。删除它前面的
async
关键字,它应该可以正常工作。
createExchangeRate
上的
async
是不必要的(尽管我认为它实际上并不有害)。async关键字允许您使用
wait
(您没有)并使您的函数返回一个承诺(当您返回
fetch()
时,您已经这样做了)

另外,重构后的额外测试也不起作用!它执行一些异步操作,但不等待响应。除非您告知,否则Mocha对承诺一无所知,因此,只要createExchangeRate返回(即,在请求返回之前),Mocha就会认为您的测试成功。如果您在每个阶段都返回承诺(
return createExchangeRate(…
return response.json(…
),那么它将实现您所期望的

更重要的是,您在mocha中混合了两种处理异步的方法,即
done
和promissions。如果您添加一个done参数,mocha将等待您调用它。如果您返回一个promission,mocha将等待该承诺解决。您只想执行其中一种,我认为尝试同时执行这两种方法可能会导致您出现一些问题这里有很多问题

如果您不包括done参数,并且您的测试返回一个承诺(就像异步函数自动执行的那样),那么一切都可能正常工作

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);
  });
});

您是否尝试过在Mocha之外以普通函数的形式运行您的测试代码?如果您可以在没有Mocha的情况下复制相同的行为,那将非常有用。首先,您可以将注意力集中在问题的实际位置(而不是Mocha)。其次,你可以在这里重写你的问题,以删除摩卡,这将有助于让更多的读者阅读你的问题。人们倾向于跳过标有他们不知道的技术的问题。问题上的标记越多样,潜在读者群就越少。你的函数createExchangeRate是否可能占用更多的时间超过默认超时?请记住,超时还包括初始化代码(因此它不仅仅是您的代码执行)。首先,您可以尝试通过在
等待
代码之前添加
this.timeout=someValue
来增加超时时间。我尝试添加30秒的超时时间,但遗憾的是没有产生任何影响。