【问题标题】: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 是否具有正确的导出键、值以及它们是否为空或未定义?

【问题讨论】:

    标签: javascript unit-testing jestjs


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-12
          • 2018-09-01
          • 1970-01-01
          • 2020-02-06
          • 2020-03-25
          • 1970-01-01
          相关资源
          最近更新 更多