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

iwe*_*ein 69 javascript unit-testing jasmine

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

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

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

expect(result).toEqual(example) //fails miserably
Run Code Online (Sandbox Code Playgroud)

我希望有一个匹配器可以通过这种情况,顺序如下:

expect(result).toInclude(example)
Run Code Online (Sandbox Code Playgroud)

我知道我可以编写一个自定义匹配器,但在我看来,这是一个常见的问题,解决方案应该已经存在.我应该在哪里寻找它?

Kam*_*zot 125

茉莉花2.0

expect(result).toEqual(jasmine.objectContaining(example))
Run Code Online (Sandbox Code Playgroud)

自此修复: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})
    }));
});
Run Code Online (Sandbox Code Playgroud)

  • 当SO答案改变以反映更好的现实时,我喜欢它:) (11认同)
  • @Siva - 也许你可以尝试直接比较`Object.keys(obj)`的结果而不是你的对象? (3认同)

Chi*_*cna 10

我遇到了同样的问题.我刚试过这段代码,它对我有用:

expect(Object.keys(myObject)).toContain('myKey');
Run Code Online (Sandbox Code Playgroud)

  • 这并没有完全解决这个问题,因为如果值不匹配,它将返回true. (3认同)