首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Jest Mocking promise不能处理错误无法读取ExpressJS中未定义的属性'then‘

Jest是一个流行的JavaScript测试框架,用于编写和运行单元测试。它提供了一套丰富的API和工具,用于模拟和断言代码的行为。在使用Jest进行测试时,有时候我们需要模拟一个返回Promise的函数,并且测试它的错误处理能力。然而,Jest的默认行为是无法正确处理Promise的错误,并且会抛出一个错误,提示无法读取未定义的属性'then'。为了解决这个问题,我们可以使用Jest提供的mock函数和async/await语法来处理Promise的错误。

下面是一个示例代码,演示如何使用Jest进行Promise的错误处理:

代码语言:javascript
复制
// 引入需要测试的模块
const myModule = require('./myModule');

// 使用Jest的mock函数来模拟一个返回Promise的函数
jest.mock('./myModule', () => ({
  myFunction: jest.fn(() => Promise.reject(new Error('Some error'))),
}));

// 编写测试用例
test('should handle promise error', async () => {
  // 调用需要测试的函数
  const result = await myModule.myFunction();

  // 断言函数是否正确处理了Promise的错误
  expect(result).toThrowError('Some error');
});

在上面的示例中,我们使用Jest的mock函数来模拟一个返回Promise的函数myFunction,并且让它返回一个被拒绝的Promise,并抛出一个错误。然后,我们使用async/await语法在测试用例中调用这个函数,并使用expect断言来验证函数是否正确处理了Promise的错误。

需要注意的是,Jest的mock函数可以模拟各种不同的行为,包括返回不同的值、抛出不同的错误等。你可以根据具体的测试需求来使用不同的mock函数。

对于ExpressJS中未定义的属性'then'的错误,通常是因为在代码中使用了一个没有返回Promise的函数,并且尝试在其上调用'then'方法。在这种情况下,你可以使用Jest的mock函数来模拟这个函数,并返回一个Promise,以便在测试中正确处理这个错误。

希望以上内容对你有帮助!如果你需要了解更多关于Jest、ExpressJS或其他云计算领域的知识,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Jest与React Testing Library:前端测试最佳实践

在你package.json添加以下依赖:npm install --save-dev jest @testing-library/react @testing-library/jest-dom#...模拟(MockingJest 提供了强大模拟功能,可以模拟组件依赖,例如API调用。...afterEach钩子可以用于此目的:afterEach(() => { cleanup();});异步测试使用waitFor或async/await处理异步操作,确保组件在测试达到期望状态:it(...);await waitFor(() => expect(screen.getByText('Example Title')).toBeInTheDocument());错误和异常处理测试组件在错误发生时行为...插件生成代码覆盖率报告,确保有足够测试覆盖:npx jest --coverage持续集成将测试集成到持续集成(CI)流程,确保代码质量始终如一:# .github/workflows/test.yml

12200

在 vue-test-utils mock 全局对象

mocks 加载选项 mocks 加载选项 是一种将任何属性附加到 Vue.prototype 上方式。...vue-i18n 例子 我们来看一个 vue-i18n 例子。虽然可以为每个测试用到 createLocalVue 并安装 vue-i18n,但那样可能会让事情难以处理并引入一堆样板。...(译注:通过这种方式就不能在单元测试耦合与特定语言相关内容了,因为翻译功能实际上已失效,也更无法处理可选参数等) 使用配置设置默认 mocks 有时需要一个 mock 默认值,这样就不用为每个测试用例都设置一遍了...Mock Value" 这个示例中用到了 Jest,所以我将把默认 mock 描述在 jest.init.js 文件 -- 该文件会在测试运行前被自动加载。... (译注:依然无法应付复杂翻译) 总结 本文论述了: 在测试用例中使用 mocks 以 mock 一个全局对象 用 config.mocks 设置默认 mock

1.6K10

JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互

此类模拟文件在 _ mocks _ 目录定义,在该目录,文件名被视为模拟模块名称。...(例如 fs 或 path ),则需要在模拟文件明确调用 jest.mock('moduleName') Jest 允许我们对函数进行监视:接下来测试是否调用了我们所创建 get 函数。...在之前文章,我们提到了阅读组件状态或属性,但这是在实际与之交互时。...,通过它我们可以得到返回 promise:在 value 属性可用。...从测试返回 promise 是能够确保 Jest 等待其解决一种方法。 总结 在本文中,我们介绍了模拟模块,并将其用于伪造 API 调用。由于没有发出实际请求要求,我们测试可以更可靠、更快。

3.7K10

web前端好帮手 - Jest单元测试工具

否则像第二种“错误写法”,只会造成JS报错,中断测试运行。 异步处理和超时处理 前端代码异步逻辑太常见了,比如文件操作、请求、定时器等。...Jest支持callback和Promise两种场景异步测试。...比如全民K歌前端这边,我们希望逐步覆盖业务公共代码测试,并且要求经过测试文件覆盖率100%,日后新增代码功能时,已测试文件覆盖率不能下降(即要求新增功能同时新增对应测试),我们可以这样设置jest.config.js...首先,由于Jest启动多个进程,并发地跑测试,我们使用node-inspect方式去跑断点调试时,chrome://inspect页面上断点不会被中断,导致我们无法断点调试。...第二点,由于Jest测试都是并发运行,有些外部资源处理要注意隔离,比如文件处理、数据库、本地缓存、请求之类

4.9K40

异步函数异常处理及测试方法

有基本了解 安装 Node.Js 和 Jest 如何从 Javascript 常规函数抛出错误 使用异常而不是返回码(清洁代码)。...抛出错误处理未知最佳方法。 同样规则适用于各种现代语言:Java、Javascript、Python、Ruby。 你可以从函数抛出错误,可以参照以下示例: ?...这是对它测试(使用Jest): ? 也可以从 ES6 抛出错误。在 Javascript 编写类时,我总会在构造函数输入意外值。下面是一个例子: ? 以下是该类测试: ?...被拒绝Promise将会在堆栈传播,除非你抓住(catch)它。 至于测试代码,应该这样写: ? 我们测试不能是普通异常,而是带有TypeErrorrejects。 现在测试通过了: ?...记住:被拒绝Promise会在堆栈传播,除非你抓住(catch)它。 要在 try/catch 中正确捕获错误,可以像这样重构: ? 这就是它工作原理。

3K30

JavaScript 测试系列实战(三):使用 Mock 模拟模块并处理组件交互

在这篇教程,我们将学习如何测试更复杂组件,包括用 Mock 去编写涉及外部 API 测试,以及通过 Enzyme 来轻松模拟组件交互 初次尝试 Jest Mock 我们应用程序通常需要从外部...postSpy.mock.results 是 post 函数发送结果数组,通过使用它,我们可以得到返回 promise,我们可以从 value 属性取到这个 promise。...从测试返回 promise 是确保 Jest 等待其异步方法执行结束一种方法。 小结 在本文中,我们介绍了 mock 模块,并将其用于伪造API调用。...,上述测试无法正常进行。...但是,上述解决方案不是很好,并且不能为我们提供进一步测试 Hooks 舒适方法。

4.8K20

Jest单元测试之旅—实践总结

在前端开发单测本身并不是被特别看重环节,特别是大部分人作为业务开发在如此卷环境下、业务不断迭代,单测带来好处并不能被完全发现,反之前期会让人觉得浪费时间并且耽误开发进度。...下面会根据各种场景进行分析 二、异步函数 在我们实际开发我们会遇到很多异步函数,但是因为Jest在进行测试时,默认情况下一旦到达运行上下文底部当前测试立即结束,这样意味着测试将不能按照我们预期进行,...导致该错误原因是因为我们在使用runOnlyPendingTimers时,把定时器执行到了setTimeout内部,但是内部执行代码是Promise.then,它是一个微任务,微任务会被推到事件队列...我们总会遇到localStorage、location等等这类内置API使用,而在我们测试环境下因为没有直接在浏览器上操作,所以并不能直接访问此类属性或方法,但得益于jsdom,它提供了强大web沙箱环境让我们能直接模拟真实...这里我们通过jsObject.defineProperty来修改windowbridage属性,从而达到模拟效果。

10.3K20

使用Jest测试包含setTimeout调用函数踩坑记录

而对于Promise实现,一个Promise对象创建时传入回调函数F会被立刻执行,但then和catch传入回调会被加入到队列,在下一轮Tick时才执行(即使F中立刻resolve或reject...虽然从错误信息我们知道可以通过jest.setTimeout来修改这个默认超时时间,但这个测试用例在实际运行时候也的确需要等待6s,如果我们有什么测试用例需要等待几分钟甚至几小时,那总不能在CI上卡个几小时等待用例通过吧...Promisethen和catch回调会将任务放入微任务队列,我们还可以通过process.nextTick将一个回调放入微任务队列。...注意我们此时使用是fake timer,因此是无法使用await delay(0)这个方案,因此这会导致我们测试用例在等待setTimeout被回调,而fake timersetTimeout又在等待...完全有可能错误地调用了setTimeout(/* ... */, 1500)。

6.8K60

JavaScript 权威指南第七版(GPT 重译)(七)

截至 Node 13,这不是导致程序退出致命错误,但会在控制台打印详细错误消息。在未来某个 Node 版本,未处理 Promise 拒绝预计将成为致命错误。...将错误参数放在第一位原因是为了让你无法忽略它,你应该始终检查这个参数是否有非空值。如果它是一个错误对象,甚至是一个整数错误代码或字符串错误消息,那么出现了问题。...如果调用emit()来发出“error”事件,并且没有为该事件类型注册处理程序,则将抛出异常。由于这是异步发生,因此您无法在catch块处理异常,因此这种错误通常会导致程序退出。...当数据实际写入并不再位于可写流内部缓冲区时,将调用此函数。 (如果发生错误,也可能调用此回调,但不能保证。您应在可写流上注册“error”事件处理程序以检测错误。)...: number} 如果在对象类型未标记属性为可选,则该属性是必需,如果实际值缺少适当属性,Flow 将报告错误。然而,通常情况下,Flow 容忍额外属性

45010

Vue 业务系统如何落地单元测试

定义 单元测试定义: 单元测试是指对软件最小可测试单元进行检查和验证。...单元在质量保证是非常重要环节,根据测试金字塔原理,越往上层测试,所需测试投入比例越大,效果也越差,而单元测试成本要小多,也更容易发现问题。...落地单元测试 ❌ 直接对一个较大业务组件添加单元测试,需要模拟一系列全局函数,无法直接运行。...质量:模块功能通过测试用例得到保障。 维护:测试即文档,方便了解业务逻辑。 实践:在添加单测过程,抽象模块,重构部分功能,并对单一职责模块增加单测。 5....代码坏味道: 神秘命名-无法取出好名字,背后可能潜藏着更深设计问题。 重复代码 过长函数-小函数、纯函数。 过长参数 全局数据-数量越多处理难度会指数上升。 可变数据-不知道在哪个节点修改了数据。

4K30

Jest + React Testing Library 单测总结

加上之前实际工作,也没有太多写测试经历,所以当自己需要对组件库补充单元测试时候,发现并不能照葫芦画瓢来写单测。...如果想要看如何安装 Jest,可以参考:Jest 上手。 Jest 常用配置项在根目录 jest.config.js ,常用配置可以参考:Jest 配置文件。...所以,Jest Mock 意义就在于可以帮助我们完成下面这些事情: 有些模块可能在测试环境不能很好地工作,或者对测试本身不是很重要,使用虚拟数据来 mock 这些模块,可以使你为代码编写测试变得更容易...:img alt 属性 ByTitle:title 属性或元素 ByRole:ARIA role,可以定位到辅助树元素 Id getByTestId:函数需要在源代码添加 data-testid...,我们在 HTML 无法通过 queryBy 找到 “hello world”,因为它三秒后才能出现    expect(screen.queryByText(/hello world/)).toBeNull

4.6K20

React + Redux Testing Library 单元测试

在同一个文件夹创建一个 math.test.js 文件,在这里我们将使用 Jest 来测试 math.js 定义函数: image.png 然后运行 yarn test (添加 NPM Script...如果你希望单元测试所测试 Order 模块是独立,那么你就不想直接使用真正 Product 或 Customer Class,因为 Customer Class 错误会直接导致 Order Class...}; }); }); 我们可以看到 jest.mock() 方法第二个参数是一个函数,那么我们就可以完全接管整个 ....而像 matchMedia 这样方法在 jsdom 里面并没有被实现,这时候我们当然就需要去把它 Mock 掉,简单把要用到一些对象属性赋值就好,总之不至于在运行时报错。...当测试 action 时候,我们需要增加一个 mocking 服务层——例如,我们可以把 API 调用抽象成服务,然后在测试文件中用 mock 服务响应所期望 API 调用。

2.3K10

如何及时发现网页隐形错误

ReferenceError: 引用了未定义变量或对象 TypeError: 类型错误 URIError: URI操作错误 SyntaxError: 语法错误 (这个错误WebIDL故意省略,保留给...ES解析器使用) Error: 普通异常,通常与 throw 语句和 try/catch 语句一起使用,利用属性 name 可以声明或了解异常类型,利用message 属性可以设置和读取异常详细信息...); Promise.then().catch(cb) 优点: 可以捕获 Promise 拒绝(失败)状态,并执行相应错误处理逻辑 可以很方便地处理 Promise 成功和失败回调 缺点: 无法捕获...Promise 内部同步异常,只能捕获到 Promise 对象本身异常 无法捕获到其他异步操作错误,例如网络请求失败等。...可以捕捉请求过程各个阶段错误,如请求失败、超时等 缺点: 需要编写更多代码来处理请求细节,容易出现回调地狱。 需要手动处理跨域问题 不支持 Promise,需要使用回调函数来处理响应结果。

19500

2020面试题--小试牛刀

箭头函数没有原型属性 箭头函数不能当做Generator函数,不能使用yield关键字 *问题:es6特性了解多少?...答: 闭包就是能够读取其他函数内部变量函数。例如在javascript,只有函数内部子函数才能读取[局部变量],所以闭包可以理解成“定义在一个[函数]内部函数“。...undefined 是 Undefined 类型唯一值,它表示未定义值。当声明变量未赋值时,或者定义属性未设置值时,默认值都为 undefined。 *问题:promise是什么?...只有异步操作结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字由来,它英语意思就是“承诺”,表示其他手段无法改变。...(error); }) 响应拦截:请求失败统一处理

1.1K20

构建工具篇 - react yarn eject 构建命令都做了什么

; }); 在初始化执行 yarn reject 时候,会先发布一个 unhandledRejection 订阅,这个订阅是在如果在事件循环一次轮询,一个 Promise 被 rejected...,并且此 Promise没有绑定错误处理器, unhandledRejection 事件会被触发。...声明要使用方法 (初始化) const fs = require('fs-extra'); // nodefs扩展,在支持fs所有api基础上,还支持promise写法 const path =...image shouldEject 属性,就是 name 属性值,当开发者输入 y 时,shouldEject 为 true,如果输入 n 时,shouldEject 为 false 当 shouldEject...读取文件内容 files.forEach(file => { let content = fs.readFileSync(file, "utf8"); //读取文件内容 // 跳过标记文件

1.8K10

你不知道 GraphQL

1+N查询问题 管理自定义Scalar类型 错误处理 日志 认证 & 中间件 Resolvers单元测试 查询引擎集成化测试 Resolvers拆分 组织Schemas 结语 目标 我们目标是针对一个移动...tontext非常适合用来处理需要在多个resolver中共享资源,有点类似其它框架注册表实例。...但这种在响应显示错误信息简单处理,并没有在服务端记录错误日志。...日志 除了数据和错误外,graphQL响应还可以包含extensions类信息,你可以在其中放你想要任何数据。我们用它来显示服务耗时信息再好不过了。...尤其是对一些大项目,这会导致根本无法维护。就像resolver那样,我也会把schema拆分到多个独立文件

3.3K20

【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门

---- 单元测试 单元测试其实在我实际开发并没有用到过,但却经常听说,接下来进行单元测试学习 Jest 和 Vue Test Utils 基础和进阶全覆盖 TDD,测试驱动开发,一种全新开发方式...async () => { const data = await userPromise() expect(data).toBe("hello") }) expect expect 会添加一些属性...,也可以获取到 promise reject 和 resolve,需要 return。...axios.get.mockReturnValue(Promise.resolve({ data: { username: 'warbler' } })) 还用更简单方式,直接返回一个 Promise...,可以在根目录下新建 __mocks__ 文件夹, 然后新建需要 mock 模块同名文件 axios.js,jest 会自动对这个文件夹下文件进行处理

1.3K20
领券