查询字符串模块中的 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 方法,但这个库就是为此而构建的!
您能否定义预期的行为是什么?
根据 documentation,stringify()
将对象转换为查询。由于您正在传递 ids
,一个元素数组,您可能会得到不同的可能行为。
请注意,在 javascript 中,数组是一个以数字为键的对象,因此 [ { id: '123' }, { id: '456' } ]
实际上看起来像 { '0': { 'id': '123' }, '1': { 'id': '456' } }
(看看 Object.keys
的数组,你会看到它是 ['0','1']
)。
所以,话虽这么说,queryString 所做的是将每对键值转换为 key=value
,其中 key
和 values
都是 "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
我正在用 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 方法,但这个库就是为此而构建的!
您能否定义预期的行为是什么?
根据 documentation,stringify()
将对象转换为查询。由于您正在传递 ids
,一个元素数组,您可能会得到不同的可能行为。
请注意,在 javascript 中,数组是一个以数字为键的对象,因此 [ { id: '123' }, { id: '456' } ]
实际上看起来像 { '0': { 'id': '123' }, '1': { 'id': '456' } }
(看看 Object.keys
的数组,你会看到它是 ['0','1']
)。
所以,话虽这么说,queryString 所做的是将每对键值转换为 key=value
,其中 key
和 values
都是 "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