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

Typescript 测试驱动开发 TDD (15)

时间:2023-09-22 15:44:37浏览次数:42  
标签:Typescript 15 complete value TDD 测试 returnedValue executeSlowFunction MockAsync

异步测试 (Asynchronous tests)


正如我们在探索JavaScript和TypeScript时所看到的,我们编写的大部分代码都是异步的。这意味着我们无法准确控制回调函数何时被调用,或者Promise何时解析,因为我们正在等待一个超出我们控制范围的事件发生。这经常在单元测试中引起问题,在这种情况下,我们需要等待异步事件完成后才能继续进行测试。以下是一个示例类:

1 class MockAsync {
2       executeSlowFunction(
3               complete: (value: string) => void
4       ) {
5             setTimeout(() => {
6                  complete(`competed`);
7             },1000);
8       }
9 }

在这里,我们有一个名为MockAsync的类,它有一个名为executeSlowFunction的方法。该方法接受一个名为complete的回调函数作为唯一参数,并在1秒后调用它。我们可以按照以下方式编写对这个类的测试:

 

 1 describe("failing async tests", () => {
 2      it("should wait for callback to complete", () => {
 3           let mockAsync = new MockAsync();
 4           console.log(`1. calling executeSlowFunction`);
 5           let returnValue !: string;
 6           mockAsync.executeSlowFunction((value: string) => {
 7                console.log(`2. complete called`);
 8                returnedValue = value;
 9           });
10 
11      })
12 });

在这里,我们有一个名为"failing async tests"的测试套件,以及一个名为"should wait for callback to complete"的测试。该测试首先创建了一个名为mockAsync的MockAsync类实例。然后它向控制台输出一条消息,并创建了一个变量named returnedValue来保存调用executeSlowFunction方法时返回的值。接下来,它调用executeSlowValueFunction函数并定义了一个回调函数。这个回调函数向控制台输出一条消息,并将回调返回的值存储在returnedValue变量中。然后,该测试向控制台输出第三条消息,并检查returnedValue变量是否包含字符串值"completed"。

运行此测试,然而,会得到以下的失败输出:

在这里,我们可以看到打印到控制台的消息是"1. calling executeSlowFunction"和"3. checking return value"。我们完全没有收到消息"2. executeSlowFunctionReturned"。我们的测试也失败了,因为返回值变量expectedValue应该是 "completed",但实际上是undefined的。

导致这个测试失败的原因是测试本身没有等待1秒钟,以便executeSlowFunction函数调用完成回调。我们真正需要的是一种信号方式,告诉我们的测试只有在异步调用完成后才执行测试期望值。

标签:Typescript,15,complete,value,TDD,测试,returnedValue,executeSlowFunction,MockAsync
From: https://www.cnblogs.com/bisslot/p/17722420.html

相关文章

  • Typescript 测试驱动开发 TDD (14)
    返回值的监视器 (Spiesreturningvalues)当我们希望模拟函数的返回值时,我们可以轻松地从模拟实现中返回一个值。作为示例,请考虑以下类:1classMyMockedClass{2functionToBeMocked():number{3return5;4}5}在这里,我们有一个名为MyMockedCl......
  • Typescript 测试驱动开发 TDD (13)
    Jest监视器 (Jestspies)Jest还提供了一种能够检查特定类方法是否被调用的能力,使用的是所谓的spy。考虑以下类定义:1classMySpiedClass{2testFunction(){3console.log(`testFunction()called`);4this.testSpiedFunction();5}6testSp......
  • 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))......
  • COMException: 检索 COM 类工厂中 CLSID 为 {DB8CBF1C-D6D3-11D4-AA51-00A024EE30BD}
    没有注册类(异常来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG)) "没有注册类(异常来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG))"一般有两种情况,我最近做项目都遇到了》第一种:(生成平台的问题) 解决方法:在项目属性里设置“生成”=>“目标平台”为x86而不是默认的......
  • golang 有没有 类似 typescript 的 联合类型?
    Go语言(Golang)不像TypeScript那样直接支持联合类型(UnionTypes)。在TypeScript中,联合类型允许一个变量具有多个不同的数据类型,而在Go中,通常使用接口(interfaces)和具体类型来处理类似的情况。以下是在Go中处理联合类型的一些方法:使用接口:Go中的接口可以用于定义一组方法的契约,而不是特......
  • ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
    GraphiteMergeTree该引擎用来对Graphite数据(图数据)进行瘦身及汇总。对于想使用ClickHouse来存储Graphite数据的开发者来说可能有用。如果不需要对Graphite数据做汇总,那么可以使用任意的ClickHouse表引擎;但若需要,那就采用GraphiteMergeTree引擎。它能减少存储空间,同时能提高Grap......
  • KOA 框架最常用的 15 个中间件!
    koa-router:提供全面的路由功能,比如类似Express的app.get/post/put的写法,URL命名参数、路由命名、嵌套路由、支持加载多个中间件koa-bodyparser:post提交数据中间件,解析请求体时需要加载的中间件,支持x-www-form-urlencoded,application/json等格式的请求体,不支持form-data的请求......
  • Typescript 测试驱动开发 TDD (9)
    匹配器(Matchers) 1.toBeJest使用所谓的匹配器来将测试中的预期值与接收到的值进行匹配。让我们快速看一下其中一些匹配器,如下所示:1it("shouldmatchwithtoBe",()=>{2expect(1).toBe(2);3});在这里,我们使用toBe匹配器来测试值1是否与值2相同。显然,这个测......