我正在使用 Vitest 和 Nuxt 3。我试图断言
useHead()
是从自定义编写的可组合项中使用给定参数调用的。在 Vitest 中,您可以创建一个间谍来断言在对象上调用了方法。但是我如何断言调用了平面函数呢? useHead()
不是对象上的方法,所以这不起作用:
import { useHead } from '@vueuse/head'
vi.mock('@vueuse/head')
vi.mocked(useHead).mockImplementation(vi.fn())
describe('myTest', () => {
const expectedArgument = 'foobar'
const spy = vi.spyOn(useHead, 'default') // or something like that?
// Do something that would call useHead(withArgs) internally...
expect(spy).toBeCalledWith(expectedArgument)
})
我也尝试过将
useHead
包装在一个简单的对象中,但这也不起作用:
describe('myTest', () => {
const expectedArgument = 'foobar'
const objectForSpying = { useHead }
const spy = vi.spyOn(objectForSpying, 'useHead')
// Do something that would call useHead(withArgs) internally...
expect(spy).toBeCalledWith(expectedArgument)
})
这让我意识到我不知道如何断言任何类型的平面函数在任何地方都被调用。我该怎么做?
编辑:我开始明白你可以断言一个平面函数被这样调用:
const myFunc = vi.fn()
myFunc()
expect(myFunc).toHaveBeenCalled()
这也意味着这有效:
import { useHead } from '@vueuse/head'
vi.mock('@vueuse/head')
vi.mocked(useHead).mockImplementation(vi.fn())
describe('myTest', () => {
useHead({ title: 'foobar' })
expect(useHead).toBeCalledWith({ title: 'foobar' })
})
但是,我仍然无法让它检测到在我自己的可组合项中调用
useHead()
时被调用:
import { useHead } from '@vueuse/head'
import myComposableThatCallsUseHead from 'path/to/composable'
vi.mock('@vueuse/head')
vi.mocked(useHead).mockImplementation(vi.fn())
describe('myTest', () => {
myComposableThatCallsUseHead()
expect(useHead).toBeCalledWith({ title: 'foobar' })
})
在这里回答我自己的问题...问题是
useHead
是 Nuxt 3 中的自动导入,我在测试中从错误的包导入它。
代替:
import { useHead } from '@vueuse/head'
用这个代替:
import { useHead } from '@unhead/vue'
还有:
vi.mock('@unhead/vue')
vi.mocked(useHead).mockImplementation(vi.fn())
我希望 Nuxt 文档能够更新以明确说明所有这些自动导入来自哪个包。