Генерация мок-данных — задача довольно тривиальная, если речь идет о создании нескольких объектов с различными значениями в нескольких полях (например, json-generator, mockaroo и npm-модули — ?q=json+generator).
Проанализировав их, я пришел к выводу, что они отлично подходят только для создания заданного количества случайных комбинаций. А у меня была задача о генерации всех возможных JSON’ов по заданным вариантам данных. Пример: есть шаблон вида {p1: '{{a}}', p2: '{{b}}'}
, для a
есть варианты — 1, 2
, а для b
— 3, 4
. В результате я рассчитываю получить 4 объекта:
[ {a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 3}, {a: 2, b: 4} ] |
Алгоритм генерации тут довольно простой — несколько вложенных циклов:
цикл по шаблонам цикл по ключам в каждом шаблоне, в значениях которых надо сделать замены цикл по вариантам данных |
Несколько «тонких» моментов:
- Замены могут потребоваться на произвольной вложенности ключа:
{a: {b: '{{replace_me}}'}}
или{a: [{b: '{{replace_me}}'}]}
- В одном ключе может быть несколько замен
Так и появился JSONium — «класс» для генерации всех возможных комбинаций объектов. Исходный код доступен на github — ссылка. Установка:
npm i jsonium |
Приведу пример использования:
var Jsonium = require('jsonium'); var j = new Jsonium(); var operators = [ {OPERATOR: "==="}, {OPERATOR: "!=="} ]; var types = [ {TYPE: "string"}, {TYPE: "object"} ]; var templates = [ { code: "var val = typeof foo {{OPERATOR}} '{{TYPE}}';" }, { code: "var val = '{{TYPE}}' {{OPERATOR}} typeof foo;" } ]; var tests = j .setTemplates(templates) .createCombos(["code"], operators) .useCombosAsTemplates() .createCombos(["code"], types) .uniqueCombos() .getCombos(); |
На выходе получится:
[ { "code": "var val = typeof foo === 'string';" }, { "code": "var val = typeof foo === 'object';" }, { "code": "var val = typeof foo !== 'string';" }, { "code": "var val = typeof foo !== 'object';" }, { "code": "var val = 'string' === typeof foo;" }, { "code": "var val = 'object' === typeof foo;" }, { "code": "var val = 'string' !== typeof foo;" }, { "code": "var val = 'object' !== typeof foo;" } ] |
Даже на таком маленьком примере видно, насколько легче добавлять новые варианты к существующим комбинациям. Если я захочу помимо строгих сравнений добавить еще варианты с нестрогими, то будет достаточно operators
сделать вида (и на выходе будет уже не 8, а 16 комбинаций):
var operators = [ {OPERATOR: "==="}, {OPERATOR: "!=="}, {OPERATOR: "!="}, {OPERATOR: "=="} ]; |
А если в types
добавить еще undefined
, symbol
, function
, number
, boolean
, то комбинаций будет уже 56. Определенно, что прописывать их «вручную» — не вариант.
Немного подробнее о методах. setTemplates
— получает массив шаблонов и сохраняет их внутри генератора. createCombos
— собственно, сам метод-генератор. Принимает два аргумента — массив со списком ключей, где делать замены, и объект с данными для замен. useCombosAsTemplates
— подкладывает созданные комбинации на место шаблонов. Это полезно, когда генерация выполняется «по цепочке». uniqueCombos
— отфильтровывает дубликаты в комбинациях. getCombos
— возвращает сгенерированные комбинации.
Свое практическое применение JSONium получил при работе над eslint-плагинами mocha-cleanup и ember-cleanup, а точнее при их тестировании. Когда количество тестов написанных «вручную» начало переваливать за адекватные рамки, было решено этот процесс автоматизировать.
jsonium
- JSONium - еще один генератор коллекций json'ов
- JSONium as another json's collection generator
Оставить комментарий