Typescript 测试驱动开发 TDD (12)

Jest模拟 (Jest mocks)


在测试我们的代码时,我们经常遇到这样的情况:我们希望确保某个特定函数被调用,或者它被使用正确的参数进行了调用。当一个特定函数按顺序调用其他函数以执行一些业务逻辑时,这种情况最常见。例如,我们可能会调用一个初始化函数,并且该初始化函数可能会调用多个REST服务来加载数据。在为我们的初始化函数编写测试时,我们希望确保所有对REST服务的调用都已完成。为了确保函数被调用,我们使用Jest模拟技术。

作为我们可以使用Jest模拟的一个示例,请考虑以下类:

1 class MyCallbackClass {
2      executeCallback(
3              value: string,
4              callbackfn:  (value: string) => null
5      ) {
6            console.log(`executeCallback invoking callbackFn`);
7            callbackFn(value);
8      } 
9 }

这里,我们有一个名为MyCallbackClass的类,它有一个名为executeCallback的方法。executeCallback函数接受两个参数,类型分别为字符串的value和callbackFn。executeCallback方法将一个值记录到控制台,并调用传入的回调函数以及传入的字符串值。

让我们来看一下如何使用Jest模拟函数作为callbackFn参数,如下所示:

1 it("should mock callback function", () => {
2     let mock = jest.fn();
3     
4     let myCallbackClass = new MyCallbackClass();
5     myCallbackClass.executeCallback('test', mock);
6 
7     expect(mock).toHaveBeenCalled();
8 });

在这里,我们通过创建一个名为mock的变量来开始我们的测试,该变量被赋值为调用jest.fn函数的结果。jest.fn函数实际上创建了一个模拟函数,可以作为回调函数的快速替代品使用。

我们的测试然后创建了一个名为myCallbackClass的MyCallbackClass实例,
然后调用executeCallback方法,将字符串值'test'和我们的模拟函数作为参数传入。
然后我们在这个模拟函数实例上使用toHaveBeenCalled匹配器,
它会测试executeCallback方法是否真正调用了我们作为参数传入的回调函数。

我们还可以检查传入的参数作为参数调用的函数是否使用了正确的参数,如下所示:

 

1 if("should call testFunction with argument using mock", () => {
2     let mock = jest.fn();
3     
4     let myCallbackClass = new MyCallbackClass();
5     myCallbackClass.executeCallback("argument_1", mock);
6     expect(mock).toHaveBeenCalledWith("argument_1");
7 });

在这里,我们使用的是 toHaveBeenCalledWith 匹配器,而不是之前测试中使用的 toHaveBeenCalled 匹配器。这样可以让我们检查传入作为参数的函数是否以正确的参数被调用。

Jest模拟是一种快速方便的创建回调函数的方式。

 

posted @ 2023-09-22 12:50  TonysDad  阅读(8)  评论(0编辑  收藏  举报