javascript - Jest : expect object not to have property

标签 javascript jestjs matcher

我想编写一个断言给定对象不具有某些属性的测试。

假设我有一个函数

function removeFooAndBar(input) {
  delete input.foo;
  delete input.bar;
  return input;
}

现在我要写一个测试:

describe('removeFooAndBar', () => {
  it('removes properties `foo` and `bar`', () => {
    const data = {
      foo: 'Foo',
      bar: 'Bar',
      baz: 'Baz',
    };
    expect(removeFooAndBar(data))
      .toEqual(expect.objectContaining({
        baz: 'Baz', // what's left
        foo: expect.not.exists() // pseudo
        bar: undefined // this doesn't work, and not what I want
      }));
  });
});

断言的正确方法是什么?

最佳答案

在评论中讨论后更新

您可以使用 expect.not.objectContaining() .这种方法工作正常,但有一个不幸的边缘情况:它在属性存在但 undefinednull 时匹配。要解决此问题,您可以明确添加要包含在检查中的那些值。你需要 jest-extended toBeOneOf() 的包裹匹配器。

expect({foo: undefined}).toEqual(expect.not.objectContaining(
    {foo: expect.toBeOneOf([expect.anything(), undefined, null])}
));

嵌套 Prop 失败的示例:

const reallyAnything = expect.toBeOneOf([expect.anything(), undefined, null]);

expect({foo: undefined, bar: {baz: undefined}}).toEqual(
    expect.not.objectContaining(
        {
            foo: reallyAnything,
            bar: {baz: reallyAnything},
        }
    )
);

原始答案

我要做的是显式检查对象是否具有名为 barfoo 的属性。

delete data.foo;
delete data.bar;
delete data.nested.property; 

expect(data).not.toHaveProperty('bar');
expect(data).not.toHaveProperty('foo');
expect(data.nested).not.toHaveProperty('property');
// or
expect(data).not.toHaveProperty('nested.property');

或者通过遍历将被删除的属性来减少重复。

const toBeRemoved = ['foo', 'bar'];

toBeRemoved.forEach((prop) => {
    delete data[prop];
    expect(data).not.toHaveProperty(prop);
});

但是,循环方法对于可能的嵌套对象来说并不是太好。 我相信你要找的是expect.not.objectContaining()

expect(data).toEqual(expect.not.objectContaining({foo: 'Foo', bar: 'Bar'}));

expect.not.objectContaining(object) matches any received object that does not recursively match the expected properties. That is, the expected object is not a subset of the received object. Therefore, it matches a received object which contains properties that are not in the expected object. - Jest Documentation

关于javascript - Jest : expect object not to have property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72219389/

相关文章:

javascript - 我无法在 React 的事件监听器上更改函数中的变量

javascript - 我的 fadeToggle() 以我不希望它出现的元素为目标

javascript - JSDoc 不解析以逗号为前缀的元素

javascript - 在 Jest 中创建自定义转换

graphql - 测试运行完成后,Jest 一秒钟都没有退出。 --检测打开句柄

scala - 如何使用junit的EqualsWithDelta

javascript - 你能从 mongo 发出 http get 请求吗?

reactjs - 对于在 React Native 上使用 enzyme 的浅层测试,this.refs 未定义

Java Split 没有按预期工作

Java Matcher 慢速正则表达式