首页 > 其他分享 >Typescript 测试驱动开发 TDD (13)

Typescript 测试驱动开发 TDD (13)

时间:2023-09-22 13:55:56浏览次数:59  
标签:testSpiedFunction 13 Typescript testFunction TDD 调用 测试 方法 我们

Jest 监视器  (Jest spies)

Jest还提供了一种能够检查特定类方法是否被调用的能力,使用的是所谓的spy。考虑以下类定义:

1 class MySpiedClass {
2    testFunction() {
3         console.log(`testFunction() called`);
4         this.testSpiedFunction();
5    }
6    testSpiedFunction() {
7         console.log(`testSpiedFunction called`);
8    }
9 }

这里,我们有一个名为MySpiedClass的类,它有两个方法。第一个方法叫testFunction,第二个方法叫testSpiedFunction。请注意,testFunction函数会将一条消息记录到控制台,并在方法体内调用testSpiedFunction。为了正确测试这段代码,我们需要一个测试来确保在调用testFunction方法时会调用testSpiedFunction。可以通过使用spy来实现此目的,如下所示:

1 it("should call testSpiedFunction", () => {
2     let mySpiedClass = new MySpiedClass();
3     const testFunctionSpy = jest.spyOn(
4             mySpiedClass, 'testSpiedFunction');
5 
6     mySpiedClass.testFunction();
7     expect(testFunctionSpy).toHaveBeenCalled();
8 });

在这里,我们有一个测试,它首先通过创建MySpiedClass的实例并将其分配给名为mySpiedClass的变量来开始。然后,我们创建了一个名为testFunctionSpy的变量,并将jest.spyOn调用的结果赋值给它。jest.spyOn函数接受两个参数。第一个参数是我们想要进行间谍操作的类实例,第二个参数是我们希望在其中创建监视器的类方法名称。在这个测试中,我们已经对testSpiedFunction方法进行了监视器操作,在调用testFunction方法时将被调用。

在这种情况下,我们对测试的期望是testFunctionSpy(对testSpiedFunction方法进行监视)已被调用。因此,使用显示器允许我们测试代码路径并确保当我们期望时它们调用其他方法。此测试的输出如下:

在这里,我们可以看到从类方法中调用了两个控制台日志。当我们调用testFunction方法时,它会将第一条消息“testFunction() called”记录到控制台。然后,testFunction方法调用了testSpiedFunction方法,该方法将第二条消息“testSpiedFunction called”记录到控制台。

请注意,我们还可以在监视器上提供一个模拟函数实现。考虑以下测试:

1 it("should call mock of testFunction", () => {
2     let mySpiedClass = new MySpiedClass();
3     const testFunctionSpy = jest.spyOn(
4          mySpiedClass, 'testFunction')
5          .mockImplementation(() => {
6               console.log(`mockImplementation called`);
7          });
8     );
9 });

在这里,我们使用了mockImplementation函数来为我们的spy提供一个在测试期间将被调用的函数实现。这个模拟实现将会向控制台输出一条消息,显示它将会被调用而不是类方法。此代码的输出如下:

在这里,我们可以看到调用了testFunction方法的模拟实现而不是testFunction方法的实际实现。这种行为很有趣值得注意。

当我们在一个方法上创建一个监视器时,我们能够检查该方法是否被调用以及是否使用了正确的参数。然而,创建一个监视器并不能阻止该方法的主体被执行。如果我们想要覆盖该方法的主体,并且不允许其被调用,则需要提供一个模拟实现。

编写测试时,判断方法体是否被调用非常重要。举个例子,假设一个方法将连接到数据库,运行查询并返回结果。在这种情况下,我们不希望运行方法的主体部分,因为我们没有数据库实例可以连接。我们希望完全模拟与数据库的任何交互。在这些情况下,我们需要提供一个模拟实现。

 

标签:testSpiedFunction,13,Typescript,testFunction,TDD,调用,测试,方法,我们
From: https://www.cnblogs.com/bisslot/p/17722113.html

相关文章

  • Typescript 测试驱动开发 TDD (12)
    Jest模拟(Jestmocks)在测试我们的代码时,我们经常遇到这样的情况:我们希望确保某个特定函数被调用,或者它被使用正确的参数进行了调用。当一个特定函数按顺序调用其他函数以执行一些业务逻辑时,这种情况最常见。例如,我们可能会调用一个初始化函数,并且该初始化函数可能会调用多个RES......
  • Typescript 测试驱动开发 TDD (10)
    测试设置和拆卸(Testsetupandteardown)在运行特定的测试之前,我们可能希望先执行一些代码。这可能是为了初始化一个特定的变量,或者确保对象的依赖关系已经设置好。同样地,我们可能希望在特定的测试运行后执行一些代码,甚至在整个测试套件运行完毕后执行。为了说明这一点,请考虑......
  • typescript_error_运算符“+”不能应用于类型“Number”和“Number”
    functionadd_(num1:Number,num2:Number){returnnum1+num2}console.log(add_(5,7))Number是一个Interface,number才是表示类型,换成小写就可以了functionadd_(num1:number,num2:number){returnnum1+num2}console.log(add_(5,7))......
  • 上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案
    自米尔国产全志T113系列的核心板发布以来,这款高性价比、低成本、入门级、高性能的国产核心板咨询不断,配套的开发板已经成交量数百套,深受工程师们的青睐,为了集齐T113全系列的产品,这次米尔发布了基于全志T113-i处理器的核心板和开发板,让广大工程师有了更多的选择。接下来看看这款T113......
  • golang 有没有 类似 typescript 的 联合类型?
    Go语言(Golang)不像TypeScript那样直接支持联合类型(UnionTypes)。在TypeScript中,联合类型允许一个变量具有多个不同的数据类型,而在Go中,通常使用接口(interfaces)和具体类型来处理类似的情况。以下是在Go中处理联合类型的一些方法:使用接口:Go中的接口可以用于定义一组方法的契约,而不是特......
  • 上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案
    自米尔国产全志T113系列的核心板发布以来,这款高性价比、低成本、入门级、高性能的国产核心板咨询不断,配套的开发板已经成交量数百套,深受工程师们的青睐,为了集齐T113全系列的产品,这次米尔发布了基于全志T113-i处理器的核心板和开发板,让广大工程师有了更多的选择。接下来看看这款T11......
  • java基础-IO流-day13
    目录1.IO的概念IO流的分类2.一个一个字符完成文件的复制3.非文本读取与复制1.IO的概念计算机内存中的数据<-->硬盘里面的数据也就是数据的落盘以及数据的读取文件的操作packagecom.msb.io01;importjava.io.File;importjava.io.IOException;/***@Auther......
  • AtCoder Beginner Contest 313 Ex Group Photo
    洛谷传送门AtCoder传送门考虑若重排好了\(a\),如何判断可不可行。显然只用把\(b\)排序,把\(\min(a_{i-1},a_i)\)也排序(定义\(a_0=a_{n+1}=+\infty\)),按顺序逐个判断是否大于即可。这启示我们将\(\min(a_{i-1},a_i)\)排序考虑。考虑从大到小加入\(a_i\),那么......
  • STL(13) map multimap
    目录基本结构源码map独有的operator[]和set的区别set中key就是value,value就是key而map中value中有key和data基本结构key不能改data可以改源码仍然是一步步的传递这里的迭代器改为了一个普通的iteratorselect1st的实现map独有的operator[]uploading-image-60053.png......
  • STL(13) set multiset
    目录源码VC6中没有identity()那么如何调用呢使用multiset有了红黑树的基础,set和map就变得很简单了源码一步一步的调用rbtree因为set的value就是key所以从value中取出key就用identity就可以而取出迭代器用的是constiterator不允许更改元素set呼叫底层rbtree所以也是一种......