开玩笑地断言该函数未被调用

问题描述 投票:45回答:4

笑话中有toeCalledtoBeCalledWith之类的函数来检查是否调用了特定函数。有什么方法可以检查未调用函数吗?

jestjs
4个回答
94
投票

只需使用not

expect(mockFn).not.toHaveBeenCalled()

7
投票

[not]对我不起作用,抛出Invalid Chai property: toHaveBeenCalled

但是使用toHaveBeenCalledTimes为零将达到目的:

expect(mock).toHaveBeenCalledTimes(0)


1
投票

请遵循jest提供的文档:https://jestjs.io/docs/en/mock-functions#mock-property

所有模拟函数均具有此特殊的.mock属性,该属性保存有关如何调用函数以及返回的函数的数据。 .mock属性还跟踪每个调用的此值,因此也可以检查此值:[...]

这些模拟成员在测试中非常有用,可以断言这些函数如何被调用,实例化或它们返回什么:

// The function was called exactly once
expect(someMockFunction.mock.calls.length).toBe(1);

或...

// The function was called exactly once
expect(someMockFunction.mock.calls.length).toBe(0);

0
投票

最近的Jest版本(22.x及更高版本)收集了相当不错的模拟函数调用统计信息,只需签出their docs

calls属性显示您的调用次数,传递给模拟的参数,返回的结果等。您可以作为mock的属性直接访问它(例如,以@Christian Bonzelet在他的答案中建议的方式):

// The function was called exactly once
expect(someMockFunction.mock.calls.length).toBe(1);

// The first arg of the first call to the function was 'first arg'
expect(someMockFunction.mock.calls[0][0]).toBe('first arg');

// The second arg of the first call to the function was 'second arg'
expect(someMockFunction.mock.calls[0][1]).toBe('second arg');

我个人更喜欢这种方式,因为它可以为您提供更大的灵活性,并使代码更清晰,以防万一您测试产生不同数量调用的不同输入。

但是,您也可以从最近(expect)开始使用Jest的spy matchers aliases PR的速记别名。我想.toHaveBeenCalledTimes在这里很合适:

.toHaveBeenCalledTimes

[在极少数情况下,您甚至可能要考虑编写自己的灯具来进行计数。例如,如果您非常注重条件调整或使用状态,它可能会很有用。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.