Как заставить Cypress динамически обновлять прибор до вызова graphql

Мне нужно изменить вызов 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. Мы используем машинописный текст.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
2
0
76
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете сначала прочитать приспособление, внести изменения перед ответом

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

Это очень близко, но я получаю Невозможно прочитать свойства неопределенного (чтение: резидент) ``` // 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 в теле, поэтому тест не проходит. Очень близко.

Julie Pixie 21.12.2022 23:40

К сожалению, я не вижу, где используется свойство resident. Этого нет ни в вопросе, ни в комментарии. Но Cypress, очевидно, может это видеть, потому что он жалуется на то, что его родителем является undefined.

Paolo 22.12.2022 06:25

Я предполагаю, что вы вставили // для символов новой строки. Попробуйте красиво добавить этот код к вопросу, возможно, кто-то сможет заметить, что нужно изменить.

Paolo 22.12.2022 06:28

Вот мой код, который, кажется, меняет запрос так, как я хочу, чтобы он изменился. Обратите внимание, что это фактический код, а не пример, поэтому он не соответствует идеально:

Julie Pixie 22.12.2022 21:49

``` ``` 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; } }) }, ); ``` Однако я получаю это в ответ:

Julie Pixie 22.12.2022 21:50

``` {ошибки: [{сообщение: "401: Несанкционировано",…}], данные: {,…}} данные: {,…} ошибки: [{сообщение: "401: Несанкционировано",…}] ​​`` ` Все под данными соответствует моим ожиданиям. Я предполагаю, что вызов 401 связан с проблемой в исходном коде. Это общая ошибка, которая, кажется, происходит, когда перехват не является тем, что хочет кипарис, и результатом является выход из системы. Я предполагаю, что это как-то связано с контекстом теста, а не с формой перехвата. Так что я думаю, что это максимально близко к решению, которое я могу получить

Julie Pixie 22.12.2022 21:51

Пометка этого ответа как решения, поскольку он успешно изменяет ответ json, и я больше не получаю ошибки о неопределенных параметрах.

Julie Pixie 22.12.2022 21:53

@ Ответ Паоло хорош. Альтернатива, чтобы избежать использования 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"]
}

Другие вопросы по теме