javascript - 使用 Typescript 异步进行 Mocha API 测试

标签 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 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 测试超时,我收到类似于以下内容的消息:

Error: timeout of 5000ms exceeded. Ensure the done() callback is being called in this test.

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

更新

如果我重构我的测试以删除 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 上的 async 不是必需的(尽管我认为它实际上并没有什么坏处)。 async 关键字允许您使用 await(您不是)并使您的函数返回一个 promise(当您返回 fetch() 时您已经在做) .

此外,重构后的额外测试不起作用!它执行一些异步操作,但不等待响应。除非您告诉它,否则 Mocha 对 promise 一无所知,因此一旦 createExchangeRate 返回(即立即在请求返回之前),Mocha 就认为您的测试成功了。如果您在每个阶段返回 promise(return createExchangeRate(...return response.json(...) 那么它就会按照您的预期进行。

更重要的是,您在 mocha 中混合了两种处理异步的方法,即 done 和 promises。如果你添加一个 done 参数,Mocha 会等到你调用它。如果你返回一个 promise,Mocha 会等到 promise 解决。您只想执行其中一个,我认为尝试同时执行这两个操作可能会给您带来一些问题。

如果您不包含 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);
  });
});

关于javascript - 使用 Typescript 异步进行 Mocha API 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40718127/

相关文章:

javascript - NodeJS 中的一个 Heroku dyno 上的多个作业

typescript 编译器 API : How to get fully qualified name of type without absolute path?

Javascript链式解构

javascript - combineLatest 重构 @deprecated — 不再支持 resultSelector,而是使用管道映射?

javascript - 无法在 TypeScript-Angular 4 应用程序中获取 this.array 变量

javascript - ES6 中 block 级函数的精确语义是什么?

javascript - Babel 6.x 中不能要求()默认导出值

javascript - 通过云作业解析云删除行

javascript - 无法在 gmap-window 中设置未定义的属性 'opacity'

javascript - 使用正则表达式选择 HTML 文本元素?