如何匹配传递给HaveBeenCalledWith的部分嵌套属性?

时间:2019-12-06 02:32:24

标签: jasmine

describe("Test", function() {
  it("should pass", function() {

    const callback = (data) => {};
    const callBackSpy = jasmine.createSpy().and.callFake(callback);

    const createData = (message) => {
      return {
        outerProp: "outerValue",
        nestedObj: {
          message: message,
          prop1: "value1",
          prop2: "value2"
        }
      };
    };

    const someApiCall = (callback) => {
      setTimeout(callback(createData("test1")), 1000);
      setTimeout(callback(createData("test2")), 2000);
      setTimeout(callback(createData("hello world")), 5000);
    };

    someApiCall(callBackSpy);

    expect(callBackSpy).toHaveBeenCalledWith(
      jasmine.objectContaining({
        nestedObj: {
          prop1: "hello world"
        }
      })
    );

  });
});

我在一个回调函数上创建了一个间谍,该函数每次都使用不同的参数多次被调用。该参数是一个复杂的嵌套对象。我正在寻找具有特定属性的对象。

如果我指定如下所示的所有属性,则可以使用

expect(callBackSpy).toHaveBeenCalledWith(
  jasmine.objectContaining({
    outerProp: "outerValue",
    nestedObj: {
      message: "hello world",
      prop1: "value1",
      prop2: "value2"
    }
  })
);

但是我不知道完整的属性。因此,我只在寻找下面的特定属性

expect(callBackSpy).toHaveBeenCalledWith(
  jasmine.objectContaining({
    nestedObj: {
      message: "hello world"
    }
  })
);

是否可以通过部分匹配使这项工作成功?

1 个答案:

答案 0 :(得分:1)

您可以尝试这个。

expect(callBackSpy).toHaveBeenCalledWith(
  jasmine.objectContaining({
    nestedObj: jasmine.objectContaining({message: 'hello world'})
  })
);

另一种方法是从方法调用中提取参数并测试特定的嵌套属性。

const arguments = callBackSpy.calls.argsFor(0);
expect(arguments[0]['nesedObject']['message'].toBe('hello world');