Моделирование
При написании тестов рано или поздно возникает необходимость создать "фиктивную" версию внутреннего или внешнего сервиса. Это обычно называется моделированием (mocking). WebdriverIO предоставляет утилиты, которые помогут вам в этом. Вы можете использовать import { fn, spyOn, mock, unmock } from '@wdio/browser-runner' для доступа к ним. Дополнительную информацию о доступных утилитах моделирования смотрите в документации API.
Функции
Чтобы проверить, вызываются ли определенные обработчики функций в рамках ваших компонентных тестов, модуль @wdio/browser-runner экспортирует примитивы моделирования, которые можно использовать для проверки вызова этих функций. Вы можете импортировать эти методы следующим образом:
import { fn, spyOn } from '@wdio/browser-runner'
Импортируя fn, вы можете создать функцию-шпион (мок) для отслеживания её выполнения, а с помощью spyOn - отслеживать метод уже созданного объекта.
- Mocks
- Spies
Полный пример можно найти в репозитории Component Testing Example.
import React from 'react'
import { $, expect } from '@wdio/globals'
import { fn } from '@wdio/browser-runner'
import { Key } from 'webdriverio'
import { render } from '@testing-library/react'
import LoginForm from '../components/LoginForm'
describe('LoginForm', () => {
it('should call onLogin handler if username and password was provided', async () => {
const onLogin = fn()
render(<LoginForm onLogin={onLogin} />)
await $('input[name="username"]').setValue('testuser123')
await $('input[name="password"]').setValue('s3cret')
await browser.keys(Key.Enter)
/**
* verify the handler was called
*/
expect(onLogin).toBeCalledTimes(1)
expect(onLogin).toBeCalledWith(expect.equal({
username: 'testuser123',
password: 's3cret'
}))
})
})
Полный пример можно найти в директории examples.
import { expect, $ } from '@wdio/globals'
import { spyOn } from '@wdio/browser-runner'
import { html, render } from 'lit'
import { SimpleGreeting } from './components/LitComponent.ts'
const getQuestionFn = spyOn(SimpleGreeting.prototype, 'getQuestion')
describe('Lit Component testing', () => {
it('should render component', async () => {
render(
html`<simple-greeting name="WebdriverIO" />`,
document.body
)
const innerElem = await $('simple-greeting').$('p')
expect(await innerElem.getText()).toBe('Hello, WebdriverIO! How are you today?')
})
it('should render with mocked component function', async () => {
getQuestionFn.mockReturnValue('Does this work?')
render(
html`<simple-greeting name="WebdriverIO" />`,
document.body
)
const innerElem = await $('simple-greeting').$('p')
expect(await innerElem.getText()).toBe('Hello, WebdriverIO! Does this work?')
})
})
WebdriverIO просто реэкспортирует @vitest/spy, который является легковесной реализацией шпионов, совместимой с Jest, и может использоваться с матчерами expect WebdriverIO. Дополнительную документацию по этим функциям-макетам можно найти на странице проекта Vitest.
Конечно, вы также можете установить и импортировать любой другой фреймворк для шпионажа, например, SinonJS, если он поддерживает среду браузера.
Модули
Моделируйте локальные модули или наблюдайте за сторонними библиотеками, которые вызываются в другом коде, что позволяет тестировать аргументы, выходные данные или даже переопределять их реализацию.
Существует два способа моделирования функций: создание функции-макета для использования в тестовом коде или написание ручного макета для переопределения зависимости модуля.