如何用 jest 测试 nuxt?

Posted

技术标签:

【中文标题】如何用 jest 测试 nuxt?【英文标题】:How to test nuxt with jest? 【发布时间】:2021-03-17 19:23:13 【问题描述】:

我只是在开玩笑地学习 Nuxt。 我的测试.vue。刚刚从https://nuxtjs.org/docs/2.x/features/data-fetching复制过来的

<template>
  <div>
    <h1 class="page-title">Mountains</h1>
    <p v-if="$fetchState.pending">Fetching mountains...</p>
    <p v-else-if="$fetchState.error">An error occurred :(</p>
    <div v-else>
      <h1>Nuxt Mountains</h1>
      <ul>
        <li v-for="mountain of mountains"> mountain.title </li>
      </ul>
      <button @click="$fetch">Refresh</button>
    </div>
  </div>
</template>
<script>
export default 
  data () 
    return 
      mountains: [],
    
  ,
  async fetch () 
    this.products = await fetch(
       'https://api.nuxtjs.dev/mountains'
    ).then(res => res.json())
  

</script>

我的 test.spec.js

import  mount  from '@vue/test-utils'
import Test from '@/components/test.vue'

describe('Test', () => 
  test('is a Vue instance', () => 
    const wrapper = mount(Test)
    const title = wrapper.find('.page-title')
    expect(title.text()).toBe("Mountains")
  )
)

当我运行 npm run test 时,我得到了这个错误。我该如何解决这个问题?

[Vue warn]: Error in render: "TypeError: Cannot read property 'pending' of undefined"

【问题讨论】:

【参考方案1】:

目前在 vue-test-utils 中没有扩展 nuxt 组件结构的库。

话虽如此,您可以很容易地使用 mocks api 自己做一些事情。

mounted(Component,  mocks:  $fetchState:  pending: true, error: true, timestamp: Date.now()   )

真正棘手的部分是在组件中找不到 fetch。您可以在选项中找到它,wrapper.vm.$options.fetch(),但目前还没有真正的测试方法......

【讨论】:

当我们从$options 获得参考时,我必须将this 调整为正确的上下文,在我的情况下,有效的是await wrapper.vm.$options.fetch.apply(wrapper.vm, [])

以上是关于如何用 jest 测试 nuxt?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 jest 测试 redux saga?

如何用 Jest 正确实现这样的测试套件架构?

如何用 Jest 测试一系列数字?

如何用 jest 在服务 (NestJS) 中测试模型 (Mongoose)

如何用 jest 测试此 api 中间件是不是处理 fetch 引发的错误?

如何用 jest 测试 axios 拦截器