如何等待 axios-mock-adapter 完成请求,就像 moxios 一样?
How to wait for request to be finished with axios-mock-adapter like it's possible with moxios?
我尝试测试从服务器获取某些内容后的渲染。
我使用 Vue Test Utils
但这无关紧要。
在组件的 created
挂钩中,ajax 调用是通过 axios
进行的。我注册了 axios-mock-adapter
响应和 'render' 组件,进行了调用并且一切正常,但我必须使用 moxios
库来等待请求完成。
it('displays metrics', (done) => {
this.mock.onGet('/pl/metrics').reply((config) => {
let value = 0
if (config.params.start == '2020-01-26') {
value = 80
}
if (config.params.start == '2020-01-28') {
value = 100
}
return [200, {
metrics: [
{
key: "i18n-key",
type: "count",
value: value
}
]
}]
})
.onAny().reply(404)
let wrapper = mount(Dashboard)
moxios.wait(function() {
let text = wrapper.text()
expect(text).toContain('80')
expect(text).toContain('100')
expect(text).toContain('+20')
done()
})
})
是否可以摆脱 moxios
并仅使用 axios-mock-adapter
实现相同的效果?
是的,您可以使用 async/await 实现自己的 flushPromises
方法:
const flushPromises = () => new Promise(resolve => setTimeout(resolve))
it('displays metrics', async () => {
this.mock.onGet('/pl/metrics').reply((config) => {
// ..
}).onAny().reply(404)
let wrapper = mount(Dashboard)
await flushPromises()
expect(text).toContain('80')
})
或使用done
和setTimeout
:
it('displays metrics', (done) => {
this.mock.onGet('/pl/metrics').reply((config) => {
// ..
}).onAny().reply(404)
let wrapper = mount(Dashboard)
setTimeout(() => {
expect(text).toContain('80')
done()
})
})
moxiois.wait
就是 schedules a callback with setTimeout
。这是可行的,因为由 setTimeout 安排的任务总是在微任务队列(如承诺回调)被清空后运行。
我尝试测试从服务器获取某些内容后的渲染。
我使用 Vue Test Utils
但这无关紧要。
在组件的 created
挂钩中,ajax 调用是通过 axios
进行的。我注册了 axios-mock-adapter
响应和 'render' 组件,进行了调用并且一切正常,但我必须使用 moxios
库来等待请求完成。
it('displays metrics', (done) => {
this.mock.onGet('/pl/metrics').reply((config) => {
let value = 0
if (config.params.start == '2020-01-26') {
value = 80
}
if (config.params.start == '2020-01-28') {
value = 100
}
return [200, {
metrics: [
{
key: "i18n-key",
type: "count",
value: value
}
]
}]
})
.onAny().reply(404)
let wrapper = mount(Dashboard)
moxios.wait(function() {
let text = wrapper.text()
expect(text).toContain('80')
expect(text).toContain('100')
expect(text).toContain('+20')
done()
})
})
是否可以摆脱 moxios
并仅使用 axios-mock-adapter
实现相同的效果?
是的,您可以使用 async/await 实现自己的 flushPromises
方法:
const flushPromises = () => new Promise(resolve => setTimeout(resolve))
it('displays metrics', async () => {
this.mock.onGet('/pl/metrics').reply((config) => {
// ..
}).onAny().reply(404)
let wrapper = mount(Dashboard)
await flushPromises()
expect(text).toContain('80')
})
或使用done
和setTimeout
:
it('displays metrics', (done) => {
this.mock.onGet('/pl/metrics').reply((config) => {
// ..
}).onAny().reply(404)
let wrapper = mount(Dashboard)
setTimeout(() => {
expect(text).toContain('80')
done()
})
})
moxiois.wait
就是 schedules a callback with setTimeout
。这是可行的,因为由 setTimeout 安排的任务总是在微任务队列(如承诺回调)被清空后运行。