繁体   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