2016-11-21 193 views
1

我正在使用Typescript,使用Mocha并尝试使用ES6 async/await生成器。使用Typescript异步的摩卡API测试

这里是我的代码:

"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返回的承诺似乎从来没有得到解决,并且永远不会达到console.log

最终摩卡测试时间了,我得到类似的消息:

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

我已经尝试了各种不同的格式,但不能看到我要去哪里错了...

UPDATE

如果我修改我的测试,以除去异步/等待关键字,它的工作原理:

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

你是否试过在Mocha之外将测试代码作为普通函数运行? *如果*您可以在没有摩卡的情况下复制相同的行为,那非常有用。首先,您可以将注意力集中在问题实际存在的位置(而不是Mocha)。其次,你可以在这里重写你的问题,以消除摩卡,这将有助于让更多读者阅读你的问题。人们倾向于跳过标有他们不知道的技术的问题。问题标签越多,潜在读者的集合越小。 – Louis

+0

您的函数createExchangeRate可能比默认超时多吗?请记住,超时也包含初始化代码(因此它不仅仅是您的代码执行)。首先,你可以在'await'代码前加'this.timeout = someValue'来尝试增加超时。 – SzybkiSasza

+0

我试着添加30秒的超时,但不幸的是没有任何区别。 – timothyclifford

回答

1

createExchangeRate上的async是没有必要的(虽然我不认为它真的很痛)。 async关键字允许你使用await(你不知道)并且让你的函数返回一个承诺(当你返回fetch()时你已经在做这个承诺)。

此外,重构后的额外测试不起作用!它执行一些异步操作,但不等待响应。摩卡对这个承诺一无所知,除非你告诉它,否则只要createExchangeRate返回(即在请求返回之前立即返回),Mocha认为你的测试是成功的。如果你在每个阶段回复承诺(return createExchangeRate(...return response.json(...),那么它会做你的期望。

更重要的是,你正在混合两种方式处理摩卡异步,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); 
    }); 
}); 
1

您的功能createExchangeRate里面没有await关键字。因此,该功能不是async。删除async之前的关键字,它应该工作正常。