Мне нужно изменить вызов graphql в Cypress, чтобы я мог изменить определенные пары ключ: значение в фикстуре в зависимости от теста.
Я знаю, что могу вызвать фикстуру graphql в формате, подобном этому:
cy.intercept('POST', '/graphql', (req) => {
if (req.body.operationName === 'operationName') {
req.reply({ fixture: 'mockData.json'});
}
}
но представьте, что mockData имеет следующую форму:
data: {
"user": {
"user": {
"userId": 123,
"inviteId": "123",
"status": "NEEDS_MORE",
"firstName": "Testy",
"lastName": "McTesterson",
"email": "[email protected]",
"phone": "3129876767",
"user": null,
"invite": {
"id": "12345",
"sentAt": null,
"sendDate": null,
"status": "NOT_SENT",
"__typename": "Invite"
},
},
}
}
Как мне перехватить вызов graphql со всей информацией в mockData.json, но изменить "status": "NEEDS_MORE" на "status": "CLAIMED" в моем тесте без изменения остальной части прибора? Идея заключалась бы в том, что в каждом блоке it спецификации я повторно использую одну и ту же фикстуру, но меняю статус и получаю разные утверждения.
Мои попытки до сих пор либо отправляли только статус без остальных данных, либо только отправляли фикстуру без каких-либо изменений. Существует документация Cypress о том, как это сделать в покое, но не в graphql. Мы используем машинописный текст.


Вы можете сначала прочитать приспособление, внести изменения перед ответом
cy.fixture('mockData.json').then(data => {
data.user.user.status = 'CLAIMED'
cy.intercept('POST', '/graphql', (req) => {
// according to one reference, this is needed
const g = JSON.parse(req.body)
if (g.operationName === 'operationName') {
req.reply({
body: {data} // same reference shows reply stubbing in this format
})
}
}
})
Ссылка: Смарт-заглушка GraphQL в Cypress
К сожалению, я не вижу, где используется свойство resident. Этого нет ни в вопросе, ни в комментарии. Но Cypress, очевидно, может это видеть, потому что он жалуется на то, что его родителем является undefined.
Я предполагаю, что вы вставили // для символов новой строки. Попробуйте красиво добавить этот код к вопросу, возможно, кто-то сможет заметить, что нужно изменить.
Вот мой код, который, кажется, меняет запрос так, как я хочу, чтобы он изменился. Обратите внимание, что это фактический код, а не пример, поэтому он не соответствует идеально:
``` ``` cy.fixture('резидент').then( (json) => { json.data. Resident. Resident.invite.status = 'NOT_SENT'; json.data. Resident. Resident.status = ' NEEDS_MOVE_IN_COST_SET'; cy.intercept('POST', '/graphql', (req) => { if (req.body.operationName === 'SingleResident') { aliasQuery(req, 'MoveInCostResident'); req.reply( (ответ: любой) => (response.body = json)); return; } }) }, ); ``` Однако я получаю это в ответ:
``` {ошибки: [{сообщение: "401: Несанкционировано",…}], данные: {,…}} данные: {,…} ошибки: [{сообщение: "401: Несанкционировано",…}] `` ` Все под данными соответствует моим ожиданиям. Я предполагаю, что вызов 401 связан с проблемой в исходном коде. Это общая ошибка, которая, кажется, происходит, когда перехват не является тем, что хочет кипарис, и результатом является выход из системы. Я предполагаю, что это как-то связано с контекстом теста, а не с формой перехвата. Так что я думаю, что это максимально близко к решению, которое я могу получить
Пометка этого ответа как решения, поскольку он успешно изменяет ответ json, и я больше не получаю ошибки о неопределенных параметрах.
@ Ответ Паоло хорош. Альтернатива, чтобы избежать использования cy.fixture().then()
const mockedData = require('path/to/fixture/mockData.json')
// later in your test block
mockedData.user.user.status = 'CLAIMED'
cy.intercept('POST', '/graphql', (req) => {
if (req.body.operationName === 'operationName') {
req.reply((res) => (res.body.data = mockedData))
}
})
Рассмотрите возможность использования динамического импорта для чтения прибора.
cy.intercept('POST', '**/graphql', async (req) => {
const data = await import('../fixtures/mockData.json')
data.user.user.status = 'CLAIMED'
if (req.body.operationName === 'operationName') {
req.reply({
body: {data}
})
}
})
Поскольку у вас настроен машинописный текст, добавьте resolveJsonModule к tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": ["es5", "dom"],
"types": ["cypress", "node"],
"resolveJsonModule": true
},
"include": ["**/*.ts"]
}
Это очень близко, но я получаю Невозможно прочитать свойства неопределенного (чтение: резидент) ``` // cy.fixture('резидент').then((json) => { // json.data.user.user. status = 'NEEDS_MOVE_IN_COST_SET'; // console.info('json response: ', json); // cy.intercept('POST', '/graphql', (req: any) => { // if (req. body.operationName === 'SingleResident') { // req.reply({ // body: {json} // }) // } // }); // }); ``` возвращает запрос на вкладке сети, но со словом json в теле, поэтому тест не проходит. Очень близко.