我怎样才能获得在jest模拟函数中调用的参数?

Bru*_*sma 39 javascript jestjs

我怎样才能获得在jest模拟函数中调用的参数?

我想检查对象传递作为参数.

Bru*_*sma 68

只需使用mockObject.calls.在我的情况下我用过:

const call = mockUpload.mock.calls[0][0]
Run Code Online (Sandbox Code Playgroud)

这是关于该属性文档mock

  • 谢谢你!对于其他人和我未来的自己:如果您在第二个“0”上收到编译错误“Tuple type '[]' of length '0' has no element at index '0'.”,您可以使用“ const call = (mockUpload.mock.calls[0] as any[])[0];`。 (7认同)
  • 进一步挖掘类型:TypeScript 中的正确方法是 `jest.fn((args) => "foobar")`:显式定义 `args` 将导致更好的类型,而 `mock.calls[0][ 0]` 将被 TypeScript 接受。这是因为如果你在你的模拟中使用 2 个参数,`mock.calls[0]` 是一个长度为 2 的数组。如果你使用 1 个参数,长度为 1,并且 0 个参数 => 长度 0。所以在你的模拟中只需使用与函数期望的参数数量相同,即使您不使用它们。 (4认同)
  • 关于长度为“0”的元组类型“[]”在索引“0”处没有元素。错误:在我的例子中,我使用“SpyInstance”键入了模拟,但不了解该类型的两个通用参数。`SpyInstance<R, A>` 接受返回类型 `R` 和一个参数类型数组 `A`。指定 `SpyInstance<unknown, [...unknown[]]>` 的类型允许我从模拟的调用中获取任意数量的参数,而不会出现任何错误。 (2认同)

Jbo*_*aga 26

您可以与或toHaveBeenCalledWith()一起使用expect.stringContainingexpect.arrayContaining()expect.objectContaining()

...
const { host } = new URL(url);
expect(mockedFunction).toHaveBeenCalledWith("param1", expect.stringContaining(`http://${host}...`);
Run Code Online (Sandbox Code Playgroud)

  • 太感谢了!这种组合正是我所寻找的。另外,如果您不关心第一个或第二个参数,您可以对其使用“expect.anything()”。 (5认同)

Sen*_* SP 13

这是断言所传递参数的简单方法。

expect(mockedFunction).toHaveBeenCalledWith("param1","param2");
Run Code Online (Sandbox Code Playgroud)

  • 和其他答案一样。这并不能回答问题。他并不是在问如何检查它是用什么参数调用的,而是询问如何获取该参数以便他可以检查它。 (5认同)
  • 在这种情况下,请使用“mockUpload.mock.calls[0]”这种方法 (2认同)

Sau*_*lva 8

使用参数捕获器,如下所示:

let barArgCaptor;
const appendChildMock = jest
    .spyOn(foo, "bar")
    .mockImplementation(
    (arg) => (barArgCaptor = arg)
    );
Run Code Online (Sandbox Code Playgroud)

然后你就可以expect随心所欲地对俘虏的属性进行评价了:

expect(barArgCaptor.property1).toEqual("Fool of a Took!");
expect(barArgCaptor.property2).toEqual(true);
Run Code Online (Sandbox Code Playgroud)


Ger*_*ica 5

我发现我经常想要验证对模拟函数的精确调用的确切参数;我的方法是:

let mockFn = jest.fn((/* ... */) => { /* ... */ });

// ... do some testing which triggers `mockFn` ...

expect(mockFn.mock.calls).toEqual([

  // Ensure `mockFn` was called exactly 3 times:
  
  // The 1st time with arguments "a" and 1,
  [ 'a', 1 ],

  // 2nd time with arguments "b" and 2,
  [ 'b', 2 ],
  
  // 3rd time with arguments "c" and 3
  [ 'c', 3 ]

]);

Run Code Online (Sandbox Code Playgroud)