Я использую vitest с утилитами vue test для модульного тестирования методов моего компонента vue. Один из пунктов теста заключается в том, что кнопка должна вызывать метод close() при нажатии, который, в свою очередь, вызывает метод браузера window.close():
const close = () => {
console.info('close() called')
window.close()
}
У меня есть модульный тест, который имитирует window.close, но тест не проходит:
expected "spy" to be called once, but got 0 times
Я уверен, что вызывался метод close() компонента, поскольку я вижу вывод console.info в журналах тестирования.
Вот метод тестирования:
import { test, vi, expect } from "vitest";
import { mount } from "@vue/test-utils";
test('window.close is called when button is clicked', async () => {
const wrapper = mount(MyComponent, {
global: {
plugins: [router]
}
})
const btn = wrapper.find('#exit-button')
await btn.trigger('click')
window.close = vi.fn()
expect(window.close).toHaveBeenCalledOnce()
})





Замена window.close в поддельном DOM может не иметь негативных побочных эффектов, но обычно это не рекомендуется. spyOn предпочтительнее для методов, поскольку позволяет восстановить исходную реализацию.
Шпион должен быть установлен до его вызова, он должен быть:
vi.spyOn(window, 'close')
const btn = wrapper.find('#exit-button')
await btn.trigger('click')
expect(window.close).toHaveBeenCalledOnce()