查询字符串模块中的 stringify 在 Jest 测试中未按预期工作

stringify in query-string module not working as expected in Jest tests

我正在用 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

根据 query-string 模块的要求,我使用的是 node > 6 的版本。

我还补充了:

/* jest commonjs */

到我的测试文件的顶部作为查询字符串目标节点。

此外,我曾尝试在 stringify 中设置各种选项,但无济于事。

谁能告诉我为什么我在这些不同的环境中会得到不同的结果,以及如何让我的测试生效?即不将字符串呈现为“%5Bobject%20”。

当然,我可以实现我自己的 stringify 方法,但这个库就是为此而构建的!

您能否定义预期的行为是什么?

根据 documentationstringify() 将对象转换为查询。由于您正在传递 ids,一个元素数组,您可能会得到不同的可能行为。

请注意,在 javascript 中,数组是一个以数字为键的对象,因此 [ { id: '123' }, { id: '456' } ] 实际上看起来像 { '0': { 'id': '123' }, '1': { 'id': '456' } }(看看 Object.keys的数组,你会看到它是 ['0','1'])。

所以,话虽这么说,queryString 所做的是将每对键值转换为 key=value,其中 keyvalues 都是 "stringified"(我假设通过 String 构造函数)。由于该值是一个对象,它 returns 你看到的东西(实际上,String({})[object Object]。我希望(我确实得到)从字符串化因此,对象数组类似于 0=[object Object]&1=[object Object](方括号转换为 %5B%5D,空格转换为 %20)。

我真的不知道 questionId 是从哪里来的,所以应该提供更多的上下文(例如,显示被字符串化的实际对象可能很有用)但是,直截了当,为了避免将您的对象转换为 [object Object] 您应该使用密钥提取器,即 returns 您实际想要显示为值的值。

因此,例如,如果您的数组如上所述并且您想要获得的结果是 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 的对象。

你可以使用这个 npm 包 https://www.npmjs.com/package/qs
它有一个工作 qs.stringify