91

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

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)

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

4

5 回答 5

158

茉莉花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})
    }));
});
于 2014-06-30T09:53:11.173 回答
11

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

expect(Object.keys(myObject)).toContain('myKey');
于 2015-07-21T09:15:59.077 回答
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;
        }
    });
});
于 2013-03-10T13:46:03.927 回答
1

我认为我会提供使用现代 javascript 地图和休息运算符的替代方案。我们可以使用带有 rest 运算符的解构来省略属性。请参阅本文中的进一步说明。

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

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

expect(rest).toEqual(example)
于 2018-08-01T20:24:36.313 回答
1

jasmine.objectContaining()仅适用于单层。

expect(result).toMatchObject(example)检查传入的对象示例是否匹配结果属性的子集。

于 2021-07-06T22:51:40.383 回答