gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:41:38 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com