.toHaveBeenCalledWith Jasmine.objectContaining 不命名所有键的部分匹配

.toHaveBeenCalledWith Jasmine.objectContaining partial match without naming all keys

我无法解决仅作为部分匹配来检查函数调用的内容的可能性。

我有另一个测试来检查完整传递的参数,但我只想在一条数据发生变化时重新测试。

我想避免一遍又一遍地输入 jasmine.anything(),所以理想情况下只想检查传递的对象中的一个键。

实际代码:

myThing.add(
    "foo",
    {
        aCheck : true,
        anObject: {}
        aString: "foo",
        aBool: true // I care whether it was passed as true or false
    },
    { another: "object" }
)

所以我的断言是:

    expect(myThing.add).toHaveBeenCalledWith(
      jasmine.objectContaining({
        aBool: true
      })
    );

    expect(myThing.add).toHaveBeenCalledWith(
      jasmine.objectContaining({
        aBool: false
      })
    );

我可以开始添加所有其他数据位,但它变得混乱:

    expect(myThing.add).toHaveBeenCalledWith(
      jasmine.any(String),
      jasmine.objectContaining({
        aCheck : jasmine.anything(),
        anObject: jasmine.any(Object)
        aString: jasmine.any(String),
        aBool: true
      }),
      jasmine.any(Object)
    );

但是由于对象中的数据量很大,因此很难调试。

如何才能只部分检查作为第二个参数调用的对象?

您可以利用每次调用该函数时都会调用的 callFake

spyOn(myThing, 'add').and.callFake((arg1, arg2, arg3) => {
  console.log('myThing.add was called');
  expect(arg2.aBool).toBe(true);
});

您也可以利用 argsForCallmostRecentCall.argshttp://tobyho.com/2011/12/15/jasmine-spy-cheatsheet/