测试异步函数 - JEST

Posted

技术标签:

【中文标题】测试异步函数 - JEST【英文标题】:Testing Asynchronous functions - JEST 【发布时间】:2021-10-25 22:02:40 【问题描述】:

代码 1:

describe("testing server functionalities", () => 
    
    // test case
    it("server handles a function", () => 
        request('some link', (error, response, body) => 
            var expected = "1410";
            expect(expected).to.be.equal(body);
        )
    )

);

代码 2:

describe("testing server functionalities", () => 
    
    // test case
    it("server handles a function", (done) => 
        request('some link', (error, response, body) => 
            var expected = "1410";
            expect(expected).to.be.equal(body);
            done();
        )
    )

);

所以在Code-1 中,我们遇到了在检查value 是否满足expected value 之前测试退出的问题,因为请求调用是异步

为了解决这个问题,我找到了一种方法,在Code-2 中引入的参数done 使测试函数等待done() 函数被调用,最终使测试函数正常工作。

但我不确定Code-2 是如何工作的,以及为什么测试功能要等待done

有人可以帮我解决这个问题吗?

【问题讨论】:

什么意思为什么等待完成?因为这是它的全部意义,所以当你认为测试完成时,你可以通知测试运行者。但我鼓励使用其他选项之一:jestjs.io/docs/asynchronous @jonrsharpe 所以你说这与 Jest 框架的内部逻辑有关,与回调的概念无关吧? 我不知道你想在那里画什么区别。这是框架的内部逻辑,使用回调实现。 【参考方案1】:

Here 你可以看到我们如何知道函数期望哪些参数。

这是最简单的一个。

也可以通过将 JS 文件解析为抽象语法树 (AST) 来获取此参数。

然后很容易创建不同的逻辑。

让我们想象一下它的样子(抽象地):

// Some testing framework code
const shouldWaitUntilDone = testcase.hasDoneCallback();

if (shouldWaitUntilDone) 
  // Callback will run when done() is called
  testcase.run(() =>  testcase.runMatchers(); ) 
 else 
  testcase.run().runMatchers();

【讨论】:

以上是关于测试异步函数 - JEST的主要内容,如果未能解决你的问题,请参考以下文章

用 Jest 抛出的异步测试

异步函数的行为不像我对 Jest 的预期那样

使用 Jest/Enzyme 测试异步 mapDispatchToProps 操作会出错

Jest / Enzyme - 生命周期方法中的模拟异步函数

如何使用 Jest 模拟异步函数

在异步 Jest 测试中是不是需要完成?