javascript - 异步函数的行为与我对 Jest 的预期不同

标签 javascript asynchronous jestjs

Javascript Jest 测试框架 documentation说我需要在我的回调中添加 done() 来测试异步函数,否则该函数将在测试完成后返回,因此测试将失败。我已将 Jest 添加到我的 package.json 和以下两个文件中:

src.js:

function fetchData(cb) {
  setTimeout(cb, 2000, 'peanut butter')
}

module.exports = fetchData

src.test.js:

const fetchData = require('./src')

test('the data is peanut butter', () => {
  function callback(data) {
    expect(data).toBe('peanut butter')
    // no done() method!
  }

  fetchData(callback);
})

我用上面的代码通过了测试,但我认为我应该得到一个失败的测试,因为我的测试文件中没有 done()。我的 fetchData() 方法不是异步的吗?


编辑:按照 Nicholas 的回答,我将代码更改为:

src.js:

function fetchData(cb) {
  setTimeout(cb, 2000, 'peanut')
}

module.exports = fetchData

src.test.js:

const fetchData = require('./src')

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

  fetchData(callback);
})

测试运行器应根据 Jest 文档评估期望/断言并失败(peanut 通过,peanut butter 预期),但仍显示通过测试。

此外,Jest 文档说:

If done() is never called, the test will fail, which is what you want to happen

无论是否在回调中使用 done() 方法,无论是否将正确的 (peanut butter) 参数传递给回调 (即所有四个变体都通过了)。

最佳答案

如果您不将 done 作为参数传递,测试运行器会认为代码是同步的并且不会等待特殊情况发生 - 在这种情况下调用 done

因此,在您的断言/期望有机会运行之前,测试被标记为成功。

关于javascript - 异步函数的行为与我对 Jest 的预期不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47275706/

相关文章:

php - PHP/MySQL 中的异步消息传递?

javascript - 如何从异步调用返回响应?

c# async without await 收藏

unit-testing - jest.fn() 有什么作用以及如何使用它?

javascript - 任何人都可以解释一下字符串和数字比较在 javascript 中是如何工作的吗?

javascript - Highcharts on Rails 应用程序每次加载时都会渲染两次

javascript - 在文本框中输入内容时更改文本颜色

javascript - 高度等于宽度响应调整大小javascript

node.js - 带有 fetch-mock 的 Jest 生成错误 : TypeError: Cannot read property 'prototype' of undefined when using on nodejs

reactjs - 如何使用react-testing-library触发react-select组件上的更改事件?