Один из лучших способов правильного использования моментальных снимков - зафиксировать их, чтобы другие пользователи могли анализировать в коде изменения, внесенные вами в ожидаемый результат.
Для того, чтобы этот процесс работал плавно, ваши снимки должны иметь чистый и легко читаемый результат, чтобы другие пользователи могли легко увидеть и идентифицировать внесенные изменения.
Ранее я уже упоминал о некоторых передовых методах работы с реагирующими компонентами.
Но если вы используете снимки для тестирования чего-то другого, кроме реагирующего компонента, вы также можете внести некоторые улучшения, чтобы улучшить читаемость ваших снимков.
Вы можете настроить и отформатировать вывод снимка, чтобы сделать его более читаемым с помощью сериализаторов снимков (обратите внимание, что сериализаторы снимков доступны в Jest 19+).
Рассмотрим следующий пример:
var ToDos = [ { 'Id': '1', 'Title': 'Shop groceries', 'Status': 'done' }, { 'Id': '2', 'Title': 'Go to gym', 'Status': 'pending' }, { 'Id': '3', 'Title': 'Kill it with fire', 'Status': 'done' }, { 'Id': '4', 'Title': 'Take snapshots', 'Status': 'done' }, { 'Id': '5', 'Title': 'Be awesome', 'Status': 'pending' }, ]; function filterTodos(arr, key, term) { return arr.filter(function(obj) { return obj[key] === term }); } test('it returns all todos with matching Id',() =>{ expect(filterTodos(ToDos,'Id', '1')).toMatchSnapshot()
}) test('it returns all todos with matching Title',() =>{ expect(filterTodos(ToDos,'Title',
'Shop groceries')).toMatchSnapshot()
}) test('it returns all todos with matching Status',() =>{ expect(filterTodos(ToDos,'Done', 1)).toMatchSnapshot()
})
В результате будет получен следующий снимок:
exports[`it returns all todos with matching Id 1`] = ` Array [ Object { "Id": "1", "Status": "done", "Title": "Shop groceries", }, ] `; exports[`it returns all todos with matching Status 1`] = ` Array [ Object { "Id": "1", "Status": "done", "Title": "Shop groceries", }, Object { "Id": "3", "Status": "done", "Title": "Kill it with fire", }, Object { "Id": "4", "Status": "done", "Title": "Take snapshots", }, ] `; exports[`it returns all todos with matching Title 1`] = ` Array [ Object { "Id": "1", "Status": "done", "Title": "Shop groceries", }, ] `;
Затем мы можем "усовершенствовать" этот вывод с помощью сериализатора:
expect.addSnapshotSerializer({ test:(val) => val.Id && val.Title && val.Status && val.expiration, print:(val) => `ID: ${val.Id} Title: ${val.Title} Status: ${val.Status} Expiration: ${val.expiration}` })
И тогда ваш результат должен быть:
// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`it returns all todos with matching Id: 1 1`] = ` Array [ ID: 1 Title: Shop groceries Status: done Expiration: 23/03/17 , ] `; exports[`it returns all todos with matching Status: done 1`] = ` Array [ ID: 1 Title: Shop groceries Status: done Expiration: 23/03/17 , ID: 3 Title: Kill it with fire Status: done Expiration: 23/03/17 , ID: 4 Title: Take snapshots Status: done Expiration: 23/03/17 , ] `; exports[`it returns all todos with matching Title: Shop groceries 1`] = ` Array [ ID: 1 Title: Shop groceries Status: done Expiration: 23/03/17 , ] `;
Как создать сериализатор?
Функция 'addSnapshotSerializer' предоставляет вам доступ к двум обратным вызовам 'test' и ' print ', которые получают каждое из значений, возвращаемых вашими тестовыми примерами.
В обратном вызове ‘test’ вы можете создать условие для использования сериализатора, например наличие заданного набора значений. А в callbak ‘print’ вы можете отформатировать вывод снимка, используя каждое из значений по своему усмотрению.
Я не нашел много документации по созданию сериализаторов, но, похоже, это удобный инструмент при работе с более сложными снимками.
Это отличный пример использования сериализатора снимков:
Это тест для алгоритма двоичного дерева поиска, который выводит и сравнивает результаты теста как реальное дерево, вы можете проверить источник по адресу: https://github.com/jiayihu/pretty-algorithms
Ресурсы: