gpt4 book ai didi

javascript - 使用 Jest 进行异步 Javascript 代码测试在不应该的情况下可以正常工作

转载 作者:行者123 更新时间:2023-12-03 02:24:50 25 4
gpt4 key购买 nike

Jest docs提供了一个反面例子,说明测试异步代码时不应该做什么。我是这样实现的:

const expect = require('expect');

function fetchData(cb) {
setTimeout(cb('peanut butter2'), 1500);
}

test('the data is peanut butter', () => {
function callback(data) {
expect(data).toBe('peanut butter');
}

fetchData(callback);
});

我运行了npx jest test.js,这是输出:

Fabians-MacBook-Pro:playground fabian$ npx jest test.js
FAIL ./test.js
✕ the data is peanut butter (6ms)

● the data is peanut butter

expect(received).toBe(expected)

Expected value to be (using Object.is):
"peanut butter"
Received:
"peanut butter2"

at callback (playground/test.js:9:22)
at fetchData (playground/test.js:4:16)
at Object.<anonymous>.test (playground/test.js:12:5)

Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Time: 0.866s, estimated 1s
Ran all test suites matching /test.js/i.

我不明白结果。

  1. 为什么即使我没有像 Jest 建议的那样调用 done() 来测试异步代码,它仍然有效?我很确定 setTimeout 是异步的,因为我使用 console.log() 语句在空白测试脚本中测试了它,并且第二个在第一个包含在 setTimeout 函数中的第一个之前触发。

  2. 此外,当我的超时设置为 1500 毫秒时,测试在 0.866 秒内失败。当我的回调根本不应该被调用时,Jest 怎么会收到不正确的回调数据(花生酱2)?

最佳答案

因为您的测试看起来应该是异步,但由于代码中的错误,实际上是同步

您得到了以下内容,看起来它的设计目的是在 1500ms 后调用方法 cb但您正在调用 cb 立即:

setTimeout(cb('花生酱2'), 1500);

这又将字符串传递到您的回调函数中,该函数立即/同步运行expect

您可能想要的是这样的:

setTimeout(function() { cb('花生酱2') }, 1500);

或者,让 setTimeout 将参数传递到 cb 函数中并调用它:

setTimeout(cb, 1500, '花生酱2')

正如预期的那样,它实际上会在 1500ms 后调用您的 cb 函数。

关于javascript - 使用 Jest 进行异步 Javascript 代码测试在不应该的情况下可以正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com