В настоящее время я использую testcafe для моих тестов e2e.
Поскольку testcafe не поддерживает асинхронный код c, я должен смоделировать мои запросы к GraphQL.
Есть ли какой-либо другой способ, кроме использования RequestMock функции?
Это не очень удобно для разработчиков, поскольку оно сильно сфокусировано на REST ?
РЕДАКТИРОВАТЬ:
Относительно Тот факт, что я тестирую, не позволяет использовать асин c код, вот некоторые детали: функция setBody теряется, если я пытаюсь использовать асин c код (запрашивать реальные данные). Существует проблема здесь
const handler = async (req, res) => {
// ok
res.setBody('foobar')
data = await Promise.resolve({ some: 'data' })
// setBody is no longer defined
res.setBody(JSON.stringify(data))
}
fixture('Register')
.page('http://foobar/register')
.requestHook(handler)
РЕДАКТИРОВАТЬ 2:
Я добавил два файла, которые я сейчас использую.
Пожалуйста, посмотрите на apolloHook. js непосредственно перед экспортом по умолчанию
// apolloHook.js
import { RequestMock } from 'testcafe'
import fetch from 'node-fetch'
import gql from 'graphql-tag'
import configureApolloClient from '../../../src/ApolloClient'
const urlToCatch = 'http://127.0.0.1/index.php/graphql/'
const client = configureApolloClient({
uri: 'http://nginx/index_test.php/graphql/',
fetch
})
const handler = async (req, res) => {
const body = JSON.parse(req.body.toString('utf8'))
const query = gql`${body.query}`
const { variables } = body
let data = null
if (body.query.startsWith('query')) {
data = await client.query({ query, variables })
} else {
data = await client.mutate({ mutation: query, variables })
}
// res.setBody is undefined !
res.setBody(JSON.stringify(data))
}
export default RequestMock()
.onRequestTo({ url: urlToCatch, method: 'POST' })
.respond(handler)
// register.js
import { Selector } from 'testcafe'
import { REGISTER_FIXTURES } from '../fixtures'
import { testInput, testPhoneInput, testCountryInput, testCountriesInput, testSelect } from '../utils/utils'
import apolloHook from '../utils/apolloHook'
const registerUrl = 'http://front:3000'
//Uncomment for local testing
//const registerUrl = 'http://127.0.0.1:3000'
fixture('Register')
.page(registerUrl)
.requestHooks(apolloHook)
test('Fill out sign up', async t => {
await testInput(t, Selector('[data-testid=\'email\']'), 'john.doe@professional.com')
await t
.click(Selector('[data-testid=\'send-me-a-code\']'))
.expect(Selector('[data-testid=\'one-time-password-button\']').innerText).eql('Submit')
})