r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。...---如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。 2. r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。...被调用函数在返回之前不必恢复 r12。 4. 寄存器 r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。 5....寄存器 r14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复 6. 寄存器 r15 是程序计数器 pc。它不能用于任何其它用途。...1.程序在内存分布区域 2.全局变量m赋值 3.保存进入main之前的栈底, fp-sp之间是当前函数栈 4.函数main的栈已经准备好了 5.i入栈 6.j入栈 7.准备函数fun的调用, 形参反向入栈
,一般来说就是调用相应的模块执行对应的函数或方法 Then Assert 断言,这时需要借助的就是 Matchers 的能力,Jest 还可以扩展自己的 Matcher 在 expect 后面的 toBe...}; }); }); 我们可以看到 jest.mock() 方法中的第二个参数是一个函数,那么我们就可以完全接管整个 ....但这时需要注意的是,该模板的所有功能都已经被 Mock 掉,而不会再从原模块当中返回,所以我们就需要重新实现该模块中的所有功能。...从上文的一些例子当中,我们也可以看到,不管是 Fake/Stub/Mock/Spy 最最重要的一个原则就是「简单」,因为我们是在写测试代码,而所依赖的模块就应该以最简单的形态展现出来,绝不要给 jest.fn...唯一需要注意的是, 额外的expect.assertions(number) 其实是验证在测试期间所调用的断言数量,这在测试多层异步代码时很有用,以确保实际调用回调中的断言次数。 意犹未尽吗?
}; }); }); 我们可以看到 jest.mock() 方法中的第二个参数是一个函数,那么我们就可以完全接管整个 ....从上文的一些例子当中,我们也可以看到,不管是 Fake/Stub/Mock/Spy 最最重要的一个原则就是「简单」,因为我们是在写测试代码,而所依赖的模块就应该以最简单的形态展现出来,绝不要给 jest.fn...唯一需要注意的是, 额外的expect.assertions(number) 其实是验证在测试期间所调用的断言数量,这在测试多层异步代码时很有用,以确保实际调用回调中的断言次数。...从技术上讲,你可以在真实的浏览器中运行,但由于在不同平台上启动真实浏览器的复杂性,更建议使用 JSDOM 在虚拟浏览器环境中运行 Node 中的测试。...推荐使用 mount 的方法是依赖于一个名为 jsdom的库,它本质上是一个完全在 JavaScript 中实现的 headless 浏览器。
前两天给一个包含setTimeout调用的函数写单元测试,在使用fake timer的时候遇到了问题,记录一下。...回到我们的测试用例,原因也就明确了:调用enqueueJob之后,catch中的回调被加入了队列,而随后的delay则相当于直接调用了setTimeout(前面说到Promise对象构造时的回调函数是立刻执行的...注意我们此时使用的是fake timer,因此是无法使用await delay(0)这个方案的,因此这会导致我们的测试用例在等待setTimeout被回调,而fake timer的setTimeout又在等待...问题解决 稍微思考一下,我们会发现原来的测试用例是有问题的:不论是使用真时钟还是假时钟,在调用enqueueJob后将时间向前拨3s,并不能证明任务真的恰好在3s后执行了,只能证明在3s内执行了,enqueueJob...提供的spy函数,对setTimeout函数进行了拦截侦听,被调用时不做任何事。
包含:async/await、resolves/rejects、手动调用done。 async/await:可以在传递给it的函数前面加上async,这样就和我们写代码时是一样的,会依次执行。...resolves/rejects:Jest会等待异步函数执行完毕该方法应该和async/await配合使用 手动调用done:在我们没有调用done之前,当前测试不会结束,直至调用done方法,有点类似回调...,用于代替我们的真实函数,可以通过该模块函数提供的方法获取调用信息(.mock方法)。...这意味着模块模拟不会包装原始模块,它会完全替换require系统中的原始模块。因此,mockRestore可以在模拟模块中的模拟函数上定义,但是调用它不会恢复原始实现。...,我们总会遇到localStorage、location等等这类内置的API使用,而在我们测试环境下因为没有直接在浏览器上操作,所以并不能直接访问此类属性或方法,但得益于jsdom,它提供了强大的web
在最近的 enzyme 版本更新后, shallowWrapper 的 component lifecycle 函数也会被正确的调用。因此对组件状态的测试是比较容易的。...Reducer测试 Reducer 是纯函数, 因此测试的时候只要引入函数, 传入特定参数,判断函数返回是否符合预期即可。 可以利用 jest 的 snapshot test 来判断结果。...action 利用 jest 的 spy 函数, mock const dispatch = jest.fn(), 然后把 dispatch 传给异步 action 的函数, 并验证 dispatch...selector 是可嵌套的, 但只要正确的 mock redux state, 最终的结果就应该是唯一的。 4. Utils 测试 和普通的js函数型单元测试没有区别,就不多赘述了。...Logging 测试 我在 Logging 测试中把 logger 这个 module 在初始化测试时 global 的 mock 了一个 spy 函数。
done参数,在fetchData的回调函数中调用了done。...Mock 介绍jest中的mock之前,我们先来思考一个问题:为什么要使用mock函数? 在项目中,一个模块的方法内常常会去调用另外一个模块的方法。...我们在测试中也主要是用到了mock函数提供的以下三种特性: 捕获函数调用情况 设置函数返回值 改变函数的内部实现 下面,我将分别介绍这三种方法以及他们在实际测试中的应用。...jest.spyOn() jest.spyOn()方法同样创建一个mock函数,但是该mock函数不仅能够捕获函数的调用情况,还可以正常的执行被spy的函数。...实际上,jest.spyOn()是jest.fn()的语法糖,它创建了一个和被spy的函数具有相同内部代码的mock函数。 Snapshot 快照测试 所谓snapshot,即快照也。
无论是在代码的初始搭建过程中,还是之后难以避免的重构和修正bug过程中,常常会陷入逻辑难以梳理、无法掌握全局关联的境地。...', function() { ... }); ... }); spy 正如 spy 字面的意思一样,我们用这种“间谍”来“监视”函数的调用情况 通过对监视的函数进行包装,可以通过它清楚的知道该函数被调用过几次...= {}; 另外值得一提的是,由于jest.config.js是一个会在npm脚本中被调用的普通 JS 文件,而非XXX.json或.XXXrc的形式,所以 nodejs 的各自操作都可以进行,比如引入...虽然 Jest 本身也有一些实现 spy 等的手段,但 sinon 使用起来更加方便。 III....所谓的异步操作,在不考虑和 ajax 整合的集成测试的情况下,一般都是指此类操作,只用 setTimeout 是不行的,需要搭配 done 函数使用: //组件中const Comp = (props)
端到端(在浏览器等真实场景中走通功能而把程序当成黑盒子的测试)与集成测试(集合多个测试过的单元一起测试)的反馈与修复的周期比较长、运行速度慢,测试运行不稳定,由于很多时候还要靠人工手动进行,维护成本也很高...', function() { ... }); ... }); 1.6 spy 正如 spy 字面的意思一样,我们用这种“间谍”来“监视”函数的调用情况 通过对监视的函数进行包装,...可以通过它清楚的知道该函数被调用过几次、传入什么参数、返回什么结果,甚至是抛出的异常情况。...配置 Jest 号称自己是一个 “Zero configuration testing platform”,只需在 npm scripts里面配置了test: jest,即可运行npm test,自动识别并测试符合其规则的...虽然 Jest 本身也有一些实现 spy 等的手段,但 sinon 使用起来更加方便。
例如下面这段典型的前端业务代码,涉及到网络请求、DOM操作等多个步骤,不在浏览器环境中是无法直接执行。 ....除此之外 Jest 也可以结合 enzyme 更好的在 React 项目中进行测试(enzyme 是 airbnb 开源的一个 React 测试工具,通过 Shallow Rendering 的实现对...在 Jest 中也不用像 mocha 那样通过执行 done 来通知异步结束,而是直接返回 Promise 和 async/await 就好。...); }); 环境隔离 在 Jest 中,不同的测试文件是分开独立执行的,如果担心各种 mock 和 unmock 在不同测试用例之间造成冲突,可以按照分类把用例分开放到不同文件内。...下图为在 react-native 源项目中执行 verbose 的 jest test 时,控制台的实时输出: ? Jest 的覆盖率统计: ? 详细报错定位: ?
; 沙箱和快速:Jest虚拟化了JavaScript的环境,能模拟浏览器,并且并行执行; 快照测试:Jest能够对React 树进行快照或别的序列化数值快速编写测试,提供快速更新的用户体验; 支持异步代码测试...Mock函数通常会提供以下三种特性: 捕获函数调用情况; 设置函数返回值; 改变函数的内部实现; jest.fn() jest.fn()是创建Mock函数最简单的方式,如果没有定义函数内部的实现,jest.fn...)生成一个mock函数 const fn = jest.fn(); foreach([1, 2, 3], fn); //测试mock函数被调用了3次...expect(fn.mock.calls.length).toBe(3); // 测试第二次调用的函数第一个参数是3 expect(fn.mock.calls[2][0]...Jest的异步测试主要分为3种: done函数 return promise async/await done的例子如下: function fetchData(call) { setTimeout
Storybook 则在浏览器环境中,为 UI 组件的单独编写和测试提供了可视化的、可交互的、与具体业务项目无关的单独运行环境;无论是 web 项目还是混合式的桌面应用,都可以不理会繁复的项目配置和依赖...Selenium 是自动化测试的常用工具,但新兴的 Playwright 显然得到了越来越多的青睐;后者还能更好地支持 electron 等桌面开发项目。...play 一下 在开发实践中对比几种测试,Jest/vitest 单元测试易于开发人员编写,但其运行在命令行下,不够直观;而 Storybook 展示直观,却大部分只能靠开发者人工检查其有效性,由于无法集成到...pre-commit 等开发流程中,也容易重蹈早期 Jasmine 等基于浏览器页面单测用例的覆辙 -- 编写简单但很容易过时失效。...play 函数对于习惯了写单元测试的前端开发者来说并不陌生,或者可以说是零门槛的,play 函数中的代码就是标准的单测代码。
本身在浏览器里实现模块的加载。...的单元测试并不严谨,依赖了提供 mock 数据的 php 服务器环境 三是由于视图层没有很好的组件化,从而缺乏对视图组件的测试 jest for Backbone 的实践 jest 是比较新的测试框架...另一个难点在于,Backbone.View 的 constructor / initialize “构造函数”中,并不能接受自定义的 props 参数。...jest.doMock() 方法,其缺点是用了这个就不能用 ES6 的 import 语法了,配置和使用简要说明如下: // jest.config.jsmoduleNameMapper: { "...总结 jest 灵活的配置能力,使其能方便的应用于各种类型既有项目的 TDD 开发和重构 之前的其他测试框架下的用例,可以快速迁移到 jest 中 Backbone.View 视图组件在经过 ES6 升级和合理封装后
在开发新框架时,直接运行老前端框架的单侧用例,如果所有测试用例都通过,则可快速保证内部api的一致性,快速验证所有功能。...KarmaKarma 能在真实的浏览器中测试,强大适配器,可配置其他单测框架,一般会配合 Mocha 或 Jasmine 等一起使用。每个框架都有自己的优缺点,没有最好的框架,只有最适合的框架。...Augular 的默认测试框架就是 Karma + Jasmine,Egg默认测试框架是Mocha,而 React 的默认测试框架是 Jest。.../src/fetch.js'test('fetchPostsList中的回调函数应该能够被调用', async () => { expect.assertions(1); let mockFn =...extend, helper等模块编写单元测试,特别是controller重要的路由需要做单元测试;控制台和其他React项目可以利用jest工具,针对方法、组件、模块去做单元测试,特别是组件,可以利用快照功能避免多次修改测试用例
当然,只有被订阅的 observables 才能通过 spy 进行侦察。 rxjs-spy 公开了一个模块 API 用于在代码中调用,还公开了一个控制台 API 供用户在浏览器的控制台中进行交互。...大多数时候,我都是在应用的启动代码中早早地调用模块 API 的 spy 方法,然后使用控制台 API 来执行剩下的调试工作。...控制台 API 功能 调试时,我通常使用浏览器的控制台来检查和操纵标记过的 observables 。...模块 API 的大部分方法会返回一个拆解函数,它用来解除方法的调用。在控制台中管理这些太麻烦了,所以还有另外一种选择。 调用 rxSpy.undo() 会显示所有调用过的方法的列表: ?...对于我而言,rxjs-spy 确实可以使调试 RxJS 变得有趣起来。 更多信息 rxjs-spy 的源码托管在 GitHub 上,这里有一个可以操作控制台 API 的在线示例。
@testing-library/jest-dom 是一个用于增强 Jest 测试框架的库,它提供了一组用于 DOM 断言的定制化匹配器和工具函数。...jest-location-mock 用于在 Jest 测试中模拟浏览器window.location对象的库。...它的主要作用是使你能够在测试代码中模拟修改和访问window.location的行为,而无需实际在浏览器环境中执行。...() 在控制台中打印出当前的 DOM Tree。...: 分支覆盖率,执行到每个 if 代码块; Functions: 函数覆盖率,调用到程序中的每一个函数; Lines: 行覆盖率,执行到程序中的每一行。
大家好,我是前端西瓜哥。 Jest 是一款轻量的 JavaScript 测试框架,它的卖点是简单好用,由 facebook 出品。本文就简单讲讲如何使用 Jest 对 React 组件进行测试。...注释和文档容易忘记修改,但测试用例的描述永远是准确的,因为不对就无法通过测试; 可测试性好的代码,往往可维护性更好。...Jest 基本使用 我们先写一个简单的函数,作为被测试的模块。...也支持回调函数风格的测试,你需要调用函数传入的 done 函数来表明测试完成: test('异步测试', done => { setTimeout(() => { expect('前端西瓜哥...React Testing Library 是 以用户为角度 的测试库,能够模拟浏览器的 DOM,将 React 组件挂载上去后,我们使用其提供的一些模拟用户操作的 API 进行测试。
一、技术选型: Jest + Enzyme + react-hooks-testing-library 1.1 jest Jest是FaceBook出品的前端测试框架,适合用于React和React...* toBeCalledWith:函数是否以某些参数为入参被调用 * assertions:检测用例中有多少个断言被调用,一般用于异步测试 四、Jest 周期函数 在写测试用例之前,可以用四个周期函数进行一些处理...Mock函数 在单元测试中,有许多对象或函数并不需要真实的引用,因此需要mock。...七、Jest 异步测试 Jest单元测试是同步的,因此面对异步操作如fetch获取数据,需要进行异步的模拟测试。...创建一个mock函数,该mock函数不仅捕获函数的调用情况,还可以正常的执行被spy的函数。
,但 Jest 是如何工作的我们可能还很陌生,那让我们一起走进 Jest 内心,一同探究单元测试引擎是如何工作的。...有许多类型的测试,很快你就会被术语淹没,但长话短说的测试分为三大类: 单元测试 集成测试 E2E 测试 我怎么知道要测试什么 在测试方面,即使是最简单的代码块也可能使初学者也可能会迷惑。...expect 是一个断言,该语句使用输入 1 和 2 调用被测函数中的 sum 方法,并期望输出 3。 toBe 是一个匹配器,用于检查期望值,如果不符合预期结果则应该抛出异常。...模拟 在复杂的测试场景,我们一定绕不开一个 Jest 术语:模拟(mock) 在 Jest 文档中,我们可以找到 Jest 对模拟有以下描述:”模拟函数通过抹去函数的实际实现、捕获对函数的调用,以及在这些调用中传递的参数...而 jest.fn 的实现也不难,这里我们使用一个闭包 mockFn 把替换的函数和参数给存起来,方便后续测试检查和统计调用数据。
Jest 是一个功能丰富的JavaScript测试框架,而React Testing Library 是一种提倡以用户角度编写测试的库,它鼓励测试组件的行为而不是内部实现细节。...,通常与你的组件文件同名,但带有.test.js或.test.tsx后缀。...模拟(Mocking)Jest 提供了强大的模拟功能,可以模拟组件的依赖,例如API调用。.../myFunction';jest.spyOn(myModule, 'myFunction');// 在测试中调用函数myFunction();// 检查函数是否被调用expect(myFunction...();// 重置并清除模拟的返回值和调用记录myFunction.mockClear();// 恢复原函数myFunction.mockRestore();测试异步逻辑使用async/await和await
领取专属 10元无门槛券
手把手带您无忧上云