У меня есть служба, GetStatsService
, которая содержит асинхронный метод, который вызывает несколько конечных точек API, а затем обрабатывает данные, возвращая объект. Это выглядит примерно так:
export default() {
async getMonthlyStats (userId) {
const calls = [axios.get(...), axios.get(...)]
const [stats, results, user] = await Promise.all(calls)
const combinedStats = {}
...
...
return combinedStats
}
}
Затем метод getMontlyStats
вызывается в компоненте с именем UserComparison.vue
, где он вызывается несколько раз для каждого параметра запроса маршрута, представляющего идентификатор пользователя.
Компонент UserComparison
также имеет свойство data, называемое stats
, которое представляет собой массив и в который отправляется результат вызова службы для каждого игрока:
async fetch() {
let calls = []
this.$route.query.user.forEach((id) => {
calls.push(this.fetchUserStats(id)
}
try {
await Promise.all(calls)
} catch (err) {
console.log(err)
}
}
async fetchUserStats(id){
const call = await GetStatsService.getMonthlyStats(id)
this.stats.push(call)
}
Наконец, свойство данных this.stats
затем передается в качестве реквизита дочернему компоненту, StatsTable.vue
.
Мои проблемы: я хочу протестировать сервис, но не могу сделать это ни при каких обстоятельствах. Я попытался создать тест для дочернего компонента. Там, в методе beforeEach()
, я высмеивал вызовы API с помощью moxios.
beforeEach(() => {
moxios.install(axios)
moxios.stubRequest(new RegExp(`${base_api}/users/.*/stats`), {
status: 200,
response: SampleStats
})
moxios.stubRequest(new RegExp(`${base_api}/users/.*/history`), {
status: 200,
response: SampleHistory
})
const userIds = [ '123', '456', '789']
const stats = []
userIds.forEach(async (id) => {
stats.push(await GetStatsService.getMonthlyStats(id))
}
wrapper = mount(StatsTable, {
localVue,
propsData: {
stats
},
mocks: {
$t: (t) => { return t }
},
attachToDocument: true
})
})
Я попытался с помощью vm.$nextTick()
дождаться, пока асинхронная служба вернет значение, а затем отправить его в stats
const. Я попытался использовать flush-promises
, чтобы разрешить все обещания, а затем отправить результат асинхронного вызова в массив stats
. Ничто не похоже на работу. Опора stats - это всегда пустой массив. Я осознаю, что тестирование асинхронности в Vue может быть сложным, поэтому я полагаю, что не совсем что-то понимаю.