stringify в модуле строки запроса не работает должным образом в тестах Jest - PullRequest
0 голосов
/ 01 мая 2018

Я пишу юнит-тест в Jest.

В тестируемом устройстве я импортирую

import queryString from 'query-string'

и он выполняет код:

queryString.stringify(ids)

где ids - это массив в следующем формате:

[{ id: '123' },{ id: '321' }] 

Этот код отлично работает при запуске на моей развернутой веб-странице, но в тесте JEST он дает следующий вывод:

id=%5Bobject%20Object%5D&id=%5Bobject%20Object%5D

тогда как тот же код в браузере дает:

id=123&id=321

Согласно реквизитам модуля строка запроса , я использую версию узла> 6.

Я также добавил:

/* jest commonjs */

в начало моего тестового файла в качестве узла цели строки запроса.

Кроме того, я попытался установить различные параметры в stringify , но безрезультатно.

Может кто-нибудь сказать мне, почему я получаю разные результаты в этих разных средах и как я могу заставить мой тест работать? т.е. не отображать строку как "% 5Bobject% 20".

Конечно, я мог бы реализовать свой собственный метод stringify, но эта библиотека создана для этого!

1 Ответ

0 голосов
/ 01 мая 2018

Не могли бы вы определить, каким будет ожидаемое поведение?

Согласно документации , stringify() преобразует объект в запрос. Поскольку вы передаете ids, массив элементов, возможны различные варианты поведения.

Обратите внимание, что в javascript массив - это объект с числами в качестве ключей, поэтому [ { id: '123' }, { id: '456' } ] на самом деле выглядит как { '0': { 'id': '123' }, '1': { 'id': '456' } } (взгляните на Object.keys массива, вы увидите, что он ['0','1'] ).

Итак, как говорится, то, что делает queryString, конвертирует каждую пару ключ-значение в key=value, где оба key и values были "преобразованы в строку" (я предполагаю, через конструктор String). Поскольку значение является объектом, оно возвращает то, что вы видите (на самом деле, String({}) - это [object Object]. Поэтому я ожидаю (и я действительно получаю) от строковой классификации массива объектов, что-то вроде 0=[object Object]&1=[object Object] (с квадратными скобками, преобразованными в %5B и %5D и пробелами в %20).

Я на самом деле не знаю, откуда взялась questionId, поэтому следует предоставить немного больше контекста (например, показывать, что фактический объект может быть полезен), но, чтобы добраться до сути, чтобы избежать чтобы ваш объект был преобразован в [object Object], вы должны использовать ключевой экстрактор, который возвращает значение, которое вы на самом деле хотите отобразить как значение.

Так, например, если ваш массив такой, как описано выше, и результат, который вы хотите получить, равен 0=123&1=456, вы должны сделать что-то вроде:

const ids = [ {id: '123'}, {id: '456'} ];
queryString.stringify(ids.map(v => v.id))

Вместо этого, если ожидаемое поведение id=123&id=456, вам необходимо преобразовать массив в объект { id: ['123','456'] }. Вы можете сделать это с помощью следующего

const ids = [ {id: '123'}, {id: '456'} ];
queryString.stringify({ id: ids.reduce( (c,v) => c.concat(v.id), []) })

Итак, вам нужно преобразовать исходный массив ids в объект, который подходит для stringify.

...