Javascript 单元测试因超时而失败
我在Axios XHR库周围有一个包装器,我正在尝试为我的代码编写一些单元测试。然而,当我运行测试时,它们都失败了,告诉我超时超过了。为了运行断言,我需要如何构造测试 以下是包装器代码:Javascript 单元测试因超时而失败,javascript,unit-testing,promise,mocha.js,Javascript,Unit Testing,Promise,Mocha.js,我在Axios XHR库周围有一个包装器,我正在尝试为我的代码编写一些单元测试。然而,当我运行测试时,它们都失败了,告诉我超时超过了。为了运行断言,我需要如何构造测试 以下是包装器代码: export const clientRequest = (xhrClient, endpoint, params = {}) => { const method = params.method || 'get' const {config, data, noOrg, unrestricted}
export const clientRequest = (xhrClient, endpoint, params = {}) => {
const method = params.method || 'get'
const {config, data, noOrg, unrestricted} = params
let reqParams = data
if (!isNil(data) && method === 'get') {
reqParams = {params: data}
}
const authConfig = unrestricted ? {...config, withCredentials: false} :
{...config, withCredentials: true}
const concatEndpoint = noOrg ? endpoint :
`${Cookies.get('organization') || 'default' }${endpoint}`
return new Promise((resolve, reject) => {
xhrClient[method](concatEndpoint, reqParams, authConfig)
.then(response => resolve(response))
.catch(err => reject(err))
})
}
以及有关的测试:
describe('clientRequest()', () => {
const resolveSpy = sinon.spy()
const fakeClient = {
get: () => new Promise(resolveSpy),
}
it.only('should make a call to the supplied method', (done) => {
const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'})
result.then(() => {
expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true})
done()
})
})
})
似乎,
fakeClient.get
从未解析过
由于这是一种应该被监视的方法,我建议将fakeClient
更改为以下方式:
const fakeClient = {
get: () => Promise.resolve()
}
sinon.spy(fakeClient, 'get');
添加catch
调用以处理承诺链中的错误也很重要:
result.then(() => {
expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true})
done()
}).catch(done);
似乎,
fakeClient.get
从未解析过
由于这是一种应该被监视的方法,我建议将fakeClient
更改为以下方式:
const fakeClient = {
get: () => Promise.resolve()
}
sinon.spy(fakeClient, 'get');
添加catch
调用以处理承诺链中的错误也很重要:
result.then(() => {
expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true})
done()
}).catch(done);
我最终听从了@MarcoL的建议,并回报了他们的期望
it('should make a call to the supplied method', () => {
const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'})
return result.then(() => (
expect(resolveSpy).to.have.been.calledWith('/foobar', undefined, {withCredentials: true})
))
})
我最终听从了@MarcoL的建议,并回报了他们的期望
it('should make a call to the supplied method', () => {
const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'})
return result.then(() => (
expect(resolveSpy).to.have.been.calledWith('/foobar', undefined, {withCredentials: true})
))
})
我想我回答不了你的问题。然而,我有一个关于你使用承诺的评论。。。您的
clientRequest
函数以一个返回值结束,该返回值是一个新的承诺,在它的主体中包含一个then
反应。这似乎与我所学到的承诺背道而驰,因为嵌套的承诺通常(总是?)是一种反模式,应该扁平化。这可能与您当前的问题有关,也可能与您当前的问题无关,我可能没有理解您代码的要点,但您可能希望进一步了解这一点。结果是否承诺调用然后内容?2.您确定不需要在之前的块中设置spy
和fakeClient
?注意:您只需在测试中返回承诺,而无需使用done
回调(mocha了解promissions
并等待返回的承诺完成)@MarcoL删除done
回调似乎有效。我想知道为什么它会导致它失败?如果你删除“done”回调,你就不会测试任何东西,而是以同步的方式返回。基本上你没有测试任何东西。尝试删除已完成的回调并返回“result.then()”承诺。我想我无法回答您的问题。然而,我有一个关于你使用承诺的评论。。。您的clientRequest
函数以一个返回值结束,该返回值是一个新的承诺,在它的主体中包含一个then
反应。这似乎与我所学到的承诺背道而驰,因为嵌套的承诺通常(总是?)是一种反模式,应该扁平化。这可能与您当前的问题有关,也可能与您当前的问题无关,我可能没有理解您代码的要点,但您可能希望进一步了解这一点。结果是否承诺调用然后内容?2.您确定不需要在之前的块中设置spy
和fakeClient
?注意:您只需在测试中返回承诺,而无需使用done
回调(mocha了解promissions
并等待返回的承诺完成)@MarcoL删除done
回调似乎有效。我想知道为什么它会导致它失败?如果你删除“done”回调,你就不会测试任何东西,而是以同步的方式返回。基本上你没有测试任何东西。尝试删除已完成的回调并返回“result.then()”承诺。顺便说一句,.then(response=>resolve(response))
可以很容易地替换为.then(resolve)
。感谢您的提示!不幸的是,解决方案不起作用,它仍然超时。@KevinWhitaker我已经更新了答案-可能是缺少的捕获
。没有必要捕获。只需返回该语句,“摩卡”就会在内部被捕获,顺便说一句,。然后(response=>resolve(response))
就可以轻松地替换为。然后(resolve)
。谢谢你的提示!不幸的是,解决方案不起作用,它仍然超时。@KevinWhitaker我已经更新了答案-可能是缺少的捕获
。没有必要捕获。只要把这句话还给我,“摩卡咖啡”就会在内部流行起来