#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')
})
})
})