开玩笑:如何测试对象键和值?

Posted

技术标签:

【中文标题】开玩笑:如何测试对象键和值?【英文标题】:Jest: how to test for object keys and values? 【发布时间】:2018-05-25 02:02:51 【问题描述】:

我有一个mapModule,我在其中导入和导出组件:

import ComponentName from '../components/ComponentName';

export default 
  name: ComponentName,
;

如何测试mapModule 是否具有正确的导出键、值以及它们是否为空或未定义?

【问题讨论】:

【参考方案1】:

你可以使用其中之一:

toEqual 和 toMatchObject 是对象的模板匹配器:

let Obj = name: 'component name', id: 2;
expect(oneObj).toEqual(name: 'component name') // false, should be exactly equal all Obj keys and values  
expect(oneObj).toMatchObject(name: 'component name') // true

或轻松使用 toHaveProperty :

let Obj = name: 'component name';
expect(oneObj).toHaveProperty('name') // true
expect(oneObj).toHaveProperty('name', 'component name') // true

【讨论】:

.toHaveProperty 是我想要的!谢谢 我们必须在数组中添加属性名称【参考方案2】:

在 jest 23.3.0 版本中,

expect(string).toMatch(string) 

需要一个字符串。

用途:

const expected =  name:'component name' 
const actual =  name: 'component name', type: 'form' 
expect(actual).toMatchObject(expected)

结果通过测试

【讨论】:

【参考方案3】:

请记住,.toMatchObject 检查

javascript 对象匹配对象属性的子集。”

所以 toMatchObject 可能会有意想不到的断言,例如:

expect( a: 1, b: 2 ).toMatchObject( a: 1 ); // pass

如果你确实想精确匹配一个对象,你应该使用.toStrictEqual,从jest 23开始可用:

expect( a: 1, b: 2 ).toStrictEqual( a: 1 ); // fail

【讨论】:

实际上这正是 toMatchObject 的断言所设计的。如果你不想要这种行为,你可以使用 toEqual... 这个答案确实应该是大多数情况下的首选解决方案。【参考方案4】:

对于单个密钥,您可以签出

expect(Boolean(obj[prop])).toBe(true | false);

您可以使用多个键(所有键都必须存在),

expect(Boolean(obj[prop1]) && Boolean(obj[prop2])).toBe(true | false);

对于多个键(必须存在任何一个),您可以使用

expect(Boolean(obj[prop1]) || Boolean(obj[prop2])).toBe(true | false);

【讨论】:

【参考方案5】:

另一种方法是:

expect(JSON.stringify(object)).toBe(JSON.stringify(object))

这将确保对象相同。

但是使用这个:

expect(object).toMatchObject(object)

在大多数情况下是最佳选择。

【讨论】:

嘿朋友,你永远不应该尝试从一个对象比较 JSON.stringify,因为不能保证对象顺序,所以 stringify 版本可能会改变。【参考方案6】:

刚刚添加了这个技巧,认为它为我自己的测试提供了更好的粒度,尤其是在匹配模拟服务的参数时:

expect.objectContaining(
   url: expect.stringContaining('https://'),
)

或者,您可以将正则表达式与expect.stringMatching 一起使用,它会根据值测试给定的正则表达式。很整洁。

expect.stringContaining expect.stringMatching

【讨论】:

以上是关于开玩笑:如何测试对象键和值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象数组操作为不同的键和值? [复制]

如何使用 Swifty 动态创建具有多个键和值的 json 对象

如何从数组中的对象添加新的键和值?

使用 *ngFor 访问对象的键和值

使用 *ngFor 访问对象的键和值

使用 *ngFor 访问对象的键和值