Jest:如何测试对象键和属性

fas*_*erg 37 javascript unit-testing jestjs

我有一个mapModule导入组件并导出它们的地方:

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

export default {
  name: ComponentName,
};
Run Code Online (Sandbox Code Playgroud)

如何测试mapModule具有正确导出的键,值以及它们不为null或未定义的?

小智 55

在版本23.3.0的开玩笑中,

expect(string).toMatch(string) 
Run Code Online (Sandbox Code Playgroud)

期待一个字符串.

使用:

const expected = { name:'component name' }
const actual = { name: 'component name', type: 'form' }
expect(actual).toMatchObject(expected)
Run Code Online (Sandbox Code Playgroud)

结果是通过测试


小智 45

你可以使用其中一个:

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

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
Run Code Online (Sandbox Code Playgroud)

或者很容易使用toHaveProperty:

let Obj = {name: 'component name'};
expect(oneObj).toHaveProperty('name') // true
expect(oneObj).toHaveProperty('name', 'component name') // true
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不再正确.`toMatch`应该是@ user3605834指定的`toMatchObject` (17认同)

rto*_*res 30

请记住,.toMatchObject检查

“JavaScript 对象匹配对象属性的子集。”

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

expect({ a: 1, b: 2 }).toMatchObject({ a: 1 }); // pass
Run Code Online (Sandbox Code Playgroud)

如果您确实想完全匹配对象,则应使用.toStrictEqual, 可用,因为jest 23

expect({ a: 1, b: 2 }).toStrictEqual({ a: 1 }); // fail
Run Code Online (Sandbox Code Playgroud)

  • 这个答案确实应该是大多数情况下的首选解决方案。 (3认同)

Dyl*_*rce 13

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

expect.objectContaining({
   url: expect.stringContaining('https://'),
})
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 regex 来expect.stringMatching根据值测试给定的正则表达式。很简约。

Expect.stringContaining Expect.stringMatching


Dev*_*ein 7

对于单个密钥,您可以查看

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);