如何对使用 Axios(或其他异步更新)的 Vue 组件进行单元测试?

Posted

技术标签:

【中文标题】如何对使用 Axios(或其他异步更新)的 Vue 组件进行单元测试?【英文标题】:How to unit test Vue component that uses Axios (or other async update)? 【发布时间】:2019-05-16 09:25:02 【问题描述】:

我有一个 Vue 组件/视图,它使用 Axios 执行 API 请求并使用响应更新组件数据。我正在使用 Moxios 在单元测试中模拟 Axios 请求。

我尝试使用Vue.nextTick 来推迟更新数据的断言,但此时组件尚未更新。如果我添加延迟,则断言可以正常工作:

setTimeout(() => 
    expect(wrapper.text()).toMatch('Updated text')
    done()
, 500)

但是,这是一种不好的做法,会减慢测试速度并且是一种竞争条件。

每次组件更新时都会调用某种断言检查吗?本质上,我正在寻找类似的东西:

Vue.eventually(() => 
    expect(wrapper.text()).toMatch('Updated text')
    done()
)

【问题讨论】:

你想测试什么? 我想测试一下异步操作是否正确更新了组件。 【参考方案1】:

通用(非 Vue 特定)解决方法:

const test = () => 
    try 
        expect(wrapper.text()).toMatch('Updated text')
        done()
     catch (e) 
        setTimeout(test, 1)
    

setTimeout(test, 1)

但是,expect 中的任何失败都将被忽略,如果失败,测试将超时且不显示任何消息。

【讨论】:

以上是关于如何对使用 Axios(或其他异步更新)的 Vue 组件进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 模板循环 - 异步 axios 调用

如何对 REST api 执行异步 axios 调用并更新存储(redux thunk 令人困惑)?

《转》vue更新到2.0之后vue-resource不在更新,axios的使用

在vue中使用Promise

Axios-一次发出多个请求(vue.js)

在 Vue 中用 Axios 异步请求API