Typescript 测试驱动开发 TDD (16)
使用 done
Jest 提供了一个名为 done 的方法,用于表示测试运行应该等待异步调用完成。done 函数可以作为参数传递给任何 beforeAll、beforeEach 或 it 函数,并且允许我们的异步测试在继续之前等待 done 函数被调用。让我们使用 done 重写我们之前失败的测试如下:
1 describe("async test with done ", () => { 2 let returnedValue!: string; 3 4 beoreEach((done: jest.DoneCallback) => { 5 let mockAsync = new MockAsync(); 6 console.log(`1. calling executeSlowFunction`); 7 mockAsync.executeSlowFunction((value: string) => { 8 console.log(`2. executeSlowFunction returned`); 9 returnedValue = value; 10 done(); 11 }); 12 }); 13 14 it("should return value after 1 second", () => { 15 console.log(`3. checking returnedValue`); 16 expect(returnedValue).toEqual("completed"); 17 }); 18 });
在这里,我们有一个名为"async test with done"的测试套件。在这个套件的主体中,我们声明了一个变量named returnedValue来保存异步回调返回的值。然后,我们定义了一个beforeEach函数,它有一个名为done的单一参数,类型为jest.DoneCallback。在这个beforeEach函数中,我们创建了MockAsync类的实例,在控制台上记录一条消息,并使用回调函数调用executeSlowFunction方法。在这个回调函数内部,我们记录一条消息到控制台上,并设置returnedValue变量的值,并调用done函数。
使用done时,beforeEach函数将等待直到done函数被实际调用后才继续执行测试。这个done函数只有在1秒的延迟结束后才会被调用,并且executeSlowFunction会调用我们提供的回调函数。
我们正在运行的测试被命名为"在1秒后返回值",并且在检查returnedValue变量的值之前向控制台输出一条消息。我们的测试现在成功,并且以下消息被记录到控制台中:
在这里,我们可以看到控制台日志的顺序与我们在测试中期望的执行顺序相匹配。beforeEach函数正在等待executeSlowFunction调用其回调函数,当它发生时,done函数被调用,继而继续运行测试。
从Jasmine文档中:
"在beforeEach调用中,只有在调用done函数之后,规范才会开始执行;而且只有在调用了它的done函数之后,该规范才会完成。默认情况下,Jasmine将等待5秒钟然后触发超时失败。可以使用jasmine.DEFAULT_TIMEOUT_INTERVAL变量来覆盖此设置。"