在进行 JavaScript 的单元测试中,Jest 是一个非常好用的测试框架。然而,有时候我们在写测试的时候会遇到一个问题:我们需要确保一个函数的调用是在特定对象上进行的,而 Jest 并没有提供一个针对这种场景的单独断言。这时候我们可以使用一个叫做 jest-matcher-called-on
的 npm 包来解决这个问题。
安装
我们可以使用 npm 命令进行安装:
npm install jest-matcher-called-on
使用
jest-matcher-called-on
定义了一个名为 toCalledOn
的 Matcher。它可以被用来检测一个函数是否被在特定的对象上调用。让我们来看一下如何使用它。
const objectToCheck = { someMethod: jest.fn() }; objectToCheck.someMethod(); expect(objectToCheck.someMethod).toCalledOn(objectToCheck);
在上面的例子中,我们首先定义了一个我们想要监测的对象 objectToCheck
。我们给它设置了一个叫做 someMethod
的方法,并对其进行了 mock。在这之后,我们调用了 someMethod
,然后我们使用 expect
来检查 someMethod
是否被在 objectToCheck
上调用了。我们使用了 expect(objectToCheck.someMethod).toCalledOn(objectToCheck)
来做这个检查。
如果检查不通过,Jest 会报错:expect(received).toCalledOn(object)
。如果检查通过,测试就可以顺利通过了。
让我们再看一个例子。这次我们会更加细致地控制我们的测试:
-- -------------------- ---- ------- ---------------- -------- ------ ------ -- -- - ----- ------------- - - ----------- --------- -- ----- ----------- - --- --------------------------- ----------------------------------------------------------- --------- -- - --------------------------------------------------------- ------------------- --------------- -------- -- ---- ---- ------ ---- - --------------------------- - ------ -- --- ------ ---- - -------------------------------- ---
在这个例子中,我们对两个对象进行了定义:objectToCheck
和 otherObject
。同样,我们对 objectToCheck
进行了 mock,并在其上调用了一个方法。这次我们使用两个断言来检查这种情况。
第一个断言检查了 someMethod
是否被在 objectToCheck
上调用了。如果检查通过,测试就可以通过了。如果检查不通过,测试就会失败。
第二个断言检查了 someMethod
是否被在 otherObject
上调用了。因为我们并没有在 otherObject
上调用这个方法,所以这个检查应该会失败。我们使用了 toThrowError
来检查这个检查是否失败,并对其消息进行了检查,以确保检查失败的原因是我们所想要的。
结论
使用 jest-matcher-called-on
可以让我们更加精细地控制我们的单元测试。它能够帮助我们确保调用了指定对象的指定方法,并帮助我们避免因为错误的方法调用带来的不必要的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60065b42c6eb7e50355dbd82