是否有茉莉花匹配器来比较对象的属性子集


80

我有一个对象可以沿我的测试行为扩展,但是我想确保原始属性仍然存在。

var example = {'foo':'bar', 'bar':'baz'}

var result = extendingPipeline(example)
// {'foo':'bar', 'bar':'baz', 'extension': Function}

expect(result).toEqual(example) //fails miserably

我想要一个匹配器,在这种情况下可以通过:

expect(result).toInclude(example)

我知道我可以编写一个自定义匹配器,但是在我看来,这是一个普遍的问题,应该已经有解决方案了。我应该在哪里寻找?


我在尝试比较数组时遇到了类似的问题,所以我不能直接使用jasmine.objectContaining不能如另一个答案中所述处理数组,最后我只是在期望的结果上使用array.map来获得与对象匹配的对象例如,将其留在此处作为替代方案。
布兰登·索伦·库利(BrandonSørenCulley)'18年

Answers:


141

茉莉花2.0

expect(result).toEqual(jasmine.objectContaining(example))

由于此修复程序:https : //github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 它甚至适用于嵌套对象,您只需要将要部分匹配的每个对象包装在其中jasmine.objectContaining()

简单的例子:

it('can match nested partial objects', function ()
{
    var joc = jasmine.objectContaining;
    expect({ 
        a: {x: 1, y: 2}, 
        b: 'hi' 
    }).toEqual(joc({
        a: joc({ x: 1})
    }));
});

是否可以对包含不同值和相似键的对象执行相同的操作?
瓦瓦2015年

3
@Siva-也许您可以尝试直接比较Object.keys(obj)而不是对象的结果?
卡米尔·索佐

11

我遇到了同样的问题。我只是尝试了这段代码,它对我有用:

expect(Object.keys(myObject)).toContain('myKey');

3
这不能完全解决问题,因为如果值不匹配,它将返回true。
KnownColor

2

我不认为这是普遍的,我不认为您可以找到一个。只需写一个:

beforeEach(function () {
    this.addMatchers({
        toInclude: function (expected) {
            var failed;

            for (var i in expected) {
                if (expected.hasOwnProperty(i) && !this.actual.hasOwnProperty(i)) {
                    failed = [i, expected[i]];
                    break;
                }
            }

            if (undefined !== failed) {
                this.message = function() {
                    return 'Failed asserting that array includes element "'
                        + failed[0] + ' => ' + failed[1] + '"';
                };
                return false;
            }

            return true;
        }
    });
});

1

我以为我会提供使用现代javascript映射和rest运算符的替代方法。我们可以使用带有rest运算符的解构来忽略属性。请参阅本文的进一步说明。

var example = {'foo':'bar', 'bar':'baz'}

var { extension, ...rest } = extendingPipeline(example)

expect(rest).toEqual(example)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.