Как добавить новый ключ, пару значений в json в cypress

#json #cypress

Вопрос:

У меня есть одно поле, которое я хочу прочитать и добавить в существующий json. Я знаю, что cy.write({a }) добавляет данные в файл json, но создает новую пару фигурных скобок. Я хочу написать существующий json в формате ниже

 {
  "Name":"X",
  "Age:,"Y",
  "New_data":"Z"
}
 

Прямо сейчас формат выглядит следующим образом

 {
  "Name":"X",
  "Age:,"Y",
}
{
  "New_data":"Z"
}
 

Это элегантный способ записи данных в существующий json.

Ответ №1:

Перед JSON:

 {
   "Name":"X",
   "Age":"Y"
}
 

Предполагая, что у вас есть файл example.json внутри папки fixtures. Ваш код должен выглядеть так:

 cy.readFile('cypress/fixtures/example.json').then((data) => {
  data.newKey = 'newValue'
  cy.writeFile('cypress/fixtures/example.json', JSON.stringify(data))
})
 

После JSON:

 {
   "Name":"X",
   "Age":"Y",
   "newKey":"newValue"
}
 

Комментарии:

1. Сработало как шарм

2. Пожалуйста, обратите внимание, что writeFile() не работает для тестового файла спецификаций ts

Ответ №2:

Если вы хотите добавить данные в файл JSON, вам необходимо сначала использовать cy.readfile перед записью файла JSON:

 cy.readFile('cypress/fixtures/example.json').then((data) => {
  data.newKey = 'newValue'
  cy.writeFile('cypress/fixtures/example.json', data)
})
 

Ответ №3:

Уже приведенные ответы верны и являются обычным и документированным способом решения проблемы.

Вы также можете использовать обработчик Proxy set() для автоматического сохранения объекта при каждом добавлении свойства.

 function persist(fileName, initial = {}) {
  Cypress._myObject = { ...initial }

  const handler = {
    set(obj, prop, value) {
      Reflect.set(...arguments)
      cy.writeFile(`./cypress/fixtures/${fileName}`, Cypress._myObject, { log: false });
      return true;
    }
  };
  
  return new Proxy(Cypress._myObject, handler);
}

// Wrap the object
const myObject = persist('myObject.json', { name: 'fred', age: 30 })

it('test1', () => {

  // Modify it, fixture file is also updated
  myObject.address1 = "somewhere"
  myObject.address2 = "somecity"   // could be set in a 2nd test

  // Check the fixture file
  cy.fixture('myObject.json').then(console.log)
    .should(fixture => {
      expect(fixture.address1).to.eq('somewhere')
      expect(fixture.address2).to.eq('somecity')
    })
})
 

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

/cypress/support/index.js

 Cypress.Commands.add('persist', (fileName, initial = {}) => {
  Cypress._myObject = { ...initial }

  const handler = {
    set(obj, prop, value) {
      Reflect.set(...arguments)
      cy.writeFile(`./cypress/fixtures/${fileName}`, Cypress._myObject, { log: false });
      return true;
    }
  };
  
  return new Proxy(Cypress._myObject, handler)
})
 

тест

 it('test2', () => {

  cy.persist('myObject.json', { name: 'fred', age: 30 })
    .then(myObject => {

      myObject.address1 = "somewhere"
      myObject.address2 = "somecity"

      cy.fixture('myObject.json')
        .should(fixture => {
          expect(fixture.address1).to.eq('somewhere')
          expect(fixture.address2).to.eq('somecity')
        })
    })
})