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

那些年错过React组件单元测试(上)

jest提供了三种方案来测试异步代码,下面我们分别来看一下。 done 关键字 当我们test函数中出现了异步函数时,可以给test函数传入一个done参数,它是一个函数类型参数。...).toEqual({ success: true }) done() }) }) 上面的代码中,我们给test函数传入了done参数,在fetchData函数中调用了...这样,fetchData中异步执行测试代码就能够被执行。...但这里我们思考一种场景:如果使用done来测试函数包含定时器场景,如setTimeout),由于定时器我们设置了 一定延时(如 3s)后执行,等待 3s 后会发现测试通过了。...jest.fn() jest.fn()是创建mock函数最简单方式,如果没有定义函数内部实现,jest.fn()会返回undefined作为返回值。

4.9K20

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

前两天给一个包含setTimeout调用函数写单元测试,在使用fake timer时候遇到了问题,记录一下。...而对于Promise实现,一个Promise对象创建时传入函数F会被立刻执行,但then和catch中传入会被加入到队列中,在下一轮Tick时才执行(即使F中立刻resolve或reject...根据Jest官方文档,调用这个函数后,所有队列中“微任务”都会被立刻执行,这里目的就是保证catch能被立刻调用; 使用jest.advanceTimersByTime(6000)代替await...Promisethen和catch会将任务放入微任务队列中,我们还可以通过process.nextTick将一个放入微任务队列中。...断言通过后,我们再手动调用传入函数模拟6s已经经过场景。

6.6K60
您找到你想要的搜索结果了吗?
是的
没有找到

前端自动化测试实践03—jest异步处理&mock

() => { // 模拟函数返回,getData 不会真正发起 axios 请求 axios.get.mockResolvedValueOnce({ data: 'hello' }.../mock'); 4. mock - function 模拟函数调用 对于单元测试,无需关心外部传入函数实现,使用 jest.fn 生成一个 mock 函数,可以捕获函数调用和返回结果,以及this.../mock' test('测试 callback', () => { // 【1】使用 jest 生成一个 mock 函数 func1,用来捕获函数调用 const func1 = jest.fn...函数 const func2 = jest.fn(() => { return 456 }) // 等价于 func2.mockImplementation(() => {...class 函数 对于单元测试,外部 class 实现无需关心,使用 jest.fn 生成一个 mock 类,例如测试 mock.js export const createObject = (classItem

5.1K85

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

it接受2个参数,第一个参数用于描述测试方法,第二参数接受一个函数用于测试。expect用于对结果断言,来判断当前结果是否符合预期。...resolves/rejects:Jest会等待异步函数执行完毕该方法应该和async/await配合使用 手动调用done:在我们没有调用done之前,当前测试不会结束,直至调用done方法,有点类似...每个方法都有不同使用场景,每个API都会生成一个mock模拟函数Jest模拟函数提供了很多方法给予我们模拟方法返回、实现等等,可移至文档参考 jest.fn jest.fn主要是创建一个模拟函数...恢复原本实现,只能用于jest.spyOn创建模拟,其他Mock需要手动恢复 其中jest.restoreAllMocks | .restoreMock 比较特别,只能用于jest.spyOn创建模拟...jest.mock模拟部分函数,这里使用jest.requireActual,该方法主要是绕过模拟模块导出真实模块,然后通过jest.mock工厂函数重新去定义该模拟模块内容,这种方式就可以指定导出模块具体哪些方法需要被模拟

10.2K20

Jest测试语法系列之Expect

pass指示是否存在匹配,message提供了一个没有参数函数,在失败时返回错误消息。因此当pass为false时,当expect(x). yourmatcher()失败时,消息应该返回错误消息。...例如如果你想检查一个模拟函数是否被调用,它参数是非空: test('map calls its argument with a non-null argument', () => { const...你可以在内部使用toEqual或toBeCalledWith而不是文字值。例如,如果你想检查一个模拟函数是否被调用时带有一个数字。...假设我们有一个函数doAsync,它接收两个callback1和callback2,它将异步地以一个未知顺序调用它们。...假设我们有一些处理状态函数,prepareState调用一个状态对象,validateState运行在那个状态对象上,waitOnState返回一个承诺,直到所有prepareState完成

3.5K20

万字详文:彻底搞懂 Jest 单元测试框架

什么是Jest 测试意味着什么 我怎么知道要测试什么 测试块,断言和匹配器 如何实现测试块 如何实现断言和匹配器 CLI 和配置 模拟 怎么模拟一个函数 执行环境 作用域隔离 V8 虚拟机 运行单测...test 它需要两个参数一个用于描述测试块字符串,以及一个用于包装实际测试函数。expect 包装目标函数,并结合匹配器 toBe 用于检查函数计算结果是否符合预期。...fn) => { dispatch({ type: "ADD_TEST", fn, name }); }; 我们需要在全局创建一个 state 保存测试函数,测试函数使用一个数组存起来...模拟 在复杂测试场景,我们一定绕不开一个 Jest 术语:模拟(mock) 在 Jest 文档中,我们可以找到 Jest模拟有以下描述:”模拟函数通过抹去函数实际实现、捕获对函数调用,以及在这些调用中传递参数...), }); 这是一个简单模拟示例,模拟了 fs 模块 readFile 函数在测试特定业务逻辑返回值。

7.5K20

Vue 应用单元测试策略与实践 02 - 单元测试基础

在同一个文件夹中创建一个 math.test.js 文件,在这里我们将使用 Jest 来测试 math.js 中定义函数: const { sum } = require('....相反,你可能会使用一个替身作为依赖对象,也就是我们接下来会提到 Fake/Stub/Mock/Spy。...}; }); }); 我们可以看到 jest.mock() 方法中第二个参数一个函数,那么我们就可以完全接管整个 ....而另一种特定行为就是返回特定数据,即 Stub 也可以根据输入模拟返回一种输出,作为某些模块替身帮它演戏,比如“小鲜肉们”遇到要跳车啦、要卿卿我我(误)时候就要找替身,“一二三四五六七八”连台词都不用背还需要配音...navigator.geolocation.getCurrentPostion() # chrome API 异步获取当前位置 Callback 函数 it('the data is peanut

2.2K20

Jest + React Testing Library 单测总结

1.3 组件单测须知 在开始进行组件单测时候,有几个因素我们需要考虑: 组件是否按照既定条件 / 逻辑进行渲染 组件事件是否正确 异步接口如何校验 异步执行完毕后操作如何校验 .........world'); // mock也可以返回一个Promise const promiseFn = jest.fn().mockResolvedValue('hello promise'); const...:传参数 mockFn.mock.results:得到返回值 mockFn.mock.instances:mock 包装器实例 模拟函数 mockFn.mockImplementation(fn):...RTL fireEvent 函数模拟。...; fireEvent 函数需要两个参数一个参数是定位元素 node,另一个参数是 event。这个例子中就模拟了用户点击了 button,同时 fireEvent 有两种写法。

4.5K20

提高代码质量——使用Jest和Sinon给已有的代码添加单元测试

Jest与Sinon.js是什么 Jest是FaceBook推出一个针对JavaScript进行单元测试库,它提供了断言、函数模拟等API来对你自己编写业务逻辑代码进行测试后。...编写单元测试 在本章中,我们会针对如何编写单元测试文件进行一个具体讲解,其中包含: 同步函数测试 异步函数测试 HTTP测试 同时,我们会对当中使用Jest和Sinon.jsAPI会进行简单介绍...通过上面三类测试,我们基本能够覆盖现有项目中所有代码。 同步函数测试 同步函数测试过程是这几个中最简单一部分,我们可以测试函数返回值,也能够测试传入高阶函数。...('hjava'); // 判断了callback函数第一次被调用一个参数为'hjava' }); 从上面的示例中我们可以看到,针对同步函数,我们可以通过很简单单元测试模型来验证它功能。...callback); // 发送请求来获取用户数据,成功后执行callback函数 } // user.test.js import Sinon from 'sinon'; import userFunc

3.7K00

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

vscode 并且安装了 jest 插件,那么可以实时并且直观看到测试是否通过 Jest 实现异步测试 方式 // callback const fetchUser = (cb) => {...Mock 几大功能 创建 mock function,在测试中使用,用来测试 手动 mock,覆盖第三方实现,狸猫换太子 三大 API 实现不同粒度时间控制 函数测试 function mockTest..., 返回参数二倍,可以看见 value 变成了 84 function mockTest(shouldCall, cb) { if (shouldCall) { return cb(42...mockTest(true, mockCB) console.log(mockCB.mock.calls); console.log(mockCB.mock.results); }) 还可以 mock 函数返回值...axios.get.mockReturnValue(Promise.resolve({ data: { username: 'warbler' } })) 还用更简单方式,直接返回一个 Promise

1.3K20

Jest测试语法系列之Globals

afterEach(fn, timeout) 在该文件中一个测试完成后运行一个函数,如果函数返回一个promiseJest会等待该promise在继续之前解决。...beforeAll(fn, timeout) 在该文件运行任何测试之前运行一个函数,如果函数返回一个承诺,则Jest会等待在运行测试之前解决这个问题。...beforeEach(fn, timeout) 在该文件运行每个测试之前运行一个函数,如果函数返回一个promiseJest将等待该承诺在运行测试之前解决。...test('did not rain', () => { expect(inchesOfRain()).toBe(0); }); 其中,第一个参数是测试名称,第二个参数包含测试期望函数,第三个参数...如果测试返回一个promiseJest会在测试完成之前等待promiseJest还将等待,如果你为测试函数提供一个参数,通常称为done。当你想要测试时,这将非常方便。

1K30

【送红宝书】JavaScript 测试系列实战(四):掌握 React Hooks 测试技巧

它提供了一系列专门用于测试 Hook 工具函数,能够模拟在真实组件中使用 Hooks。...它参数是至少调用一个 Hook 函数返回值是一个对象,其中我们需要关心其中 result 属性。...函数同样接受一个函数执行一系列同步操作 注意 如果不使用 act 函数,而是直接将操作写在用例中,Jest 会抛出警告,并且可能会遇到一些棘手边界情况。...这个函数调用后会返回 Promise,这个 Promise 在下次渲染 Hook 时进入 Resolve 状态,非常适合用来测试异步更新逻辑。...注意 在编写 Jest 异步测试用例时,如果涉及到 Promise 使用(包括 async/await ),要确保 return 一个值,否则测试会超时。详细介绍请参考 Jest 异步测试文档。

2.1K00

【架构师(第三十二篇)】 通用上传组件开发及测试用例

---- 主要内容 使用 TDD 开发方式,一步步开发一个上传组件 分析 Element Plus 中 uploader 组件源码 将上传组件应用到编辑器中 对于知识点发散和总结 Vue3 中实例类型...Jest 是怎么使用它来模拟浏览器环境 上传组件需求分析 基本上传流程 点击按钮选择文件,完成上传 支持查看上传文件列表 文件名称 上传状态 上传进度 删除按钮 其它更丰富显示 自定义模板 初始容器自定义...上传完毕自定义 支持一系列生命周期钩子函数,上传事件 beforeUpload onSuccess onError onChange onProgress 使用 aixos 内置 Api 设置事件参数...custom-loaded').text()).toBe('aa.url'); }); 测试上传前检查 it('before upload check', async () => { // 模拟一个函数....not.toHaveBeenCalled(); // 页面中没有生成 li expect(wrapper.findAll('li').length).toBe(0); // 函数被触发

3K50

Promise对象结果值属性介绍

在JavaScript中,Promise对象具有一个结果值属性,用于表示Promise对象解析结果。该属性可以通过Promise对象.then()方法中函数参数来访问。...它表示Promise对象操作成功完成,并返回一个结果。拒绝原因(Rejection Reason):当Promise对象被拒绝时,结果值属性将包含一个拒绝原因,通常是一个Error对象。...()函数返回一个Promise对象。...在Promise对象执行过程中,我们模拟一个异步操作,通过setTimeout函数模拟一个2秒钟延迟。在延迟结束后,我们使用resolve方法解析Promise,并传递一个字符串作为解析值。...你还可以尝试注释掉resolve行并取消注释reject行来演示Promise拒绝状态。在Promise对象.then()方法中,我们通过函数访问Promise结果值属性。

92330

前端单元测试那些事

开源一款 JS 单元测试框架,它也是 React 目前使用单元测试框架,目前vue官方也把它当作为单元测试框架官方推荐 。...我在项目开发使用jest作为单元测试框架,结合vue官方测试工具vue-util-test 3.1 Jest 安装 npm install --save-dev jest npm install -g...作为返回值,当然你也可以给他设置返回值、定义内部实现或返回Promise对象,如下例: // 断言mockFn执行后返回值为name it('jest.fn()返回值', () => { let...为了测试这个方法,我们应该做到: 我们不需要实际调用axios.get方法,需要将它mock掉 我们需要测试是否调用了axios方法(但是并不实际触发)并且返回一个Promise对象 返回Promise...对象执行了函数 注:有时候会存在一种情况,在同个组件中调用同个方法,只是返回值不同,我们可能要对它进行多次不同mock,这时候需要在beforeEach使用restoreAllMocks方法重置状态

4.3K40

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

axios 模块提供了一个 get 函数,并且会返回一个 Promise包含预先设定假数据。...首先通过 jest.spyOn,我们便可以监听一个函数使用情况,然后使用配套 toBeCalled Matcher 来判断该函数是否被调用。整体代码十分简洁,同时也保持了很好可读性。...它第一个参数是事件类型(由于我们在输入中使用onChange,因此我们应该在此处使用change),第二个参数模拟事件对象(event)。...postSpy.mock.results 是 post 函数发送结果数组,通过使用它,我们可以得到返回 promise,我们可以从 value 属性中取到这个 promise。...从测试返回 promise 是确保 Jest 等待其异步方法执行结束一种方法。 小结 在本文中,我们介绍了 mock 模块,并将其用于伪造API调用。

4.7K20

前端异步代码解决方案实践(二)

判断当前 cb 为空时,使用 deferred.promise 作为当前 promise 结合 value 调用后续处理函数继续往后执行,实现值穿透空处理函数往后传递。...在此之前异步编程形式有,函数、事件监听、发布/订阅、Promise 等。但仔细思考前面解决方案,实际还是以函数作为基础,并没有从语法结构来改变异步写法。...next 方法 Generator.prototype.next() 返回一个包含属性 done 和 value 对象,也可以接受一个参数用以向生成器传值。...返回值对象包含 done 和 value 含义与迭代器章节一致,没有可过多说道。值得关注是,next() 方法可以接受一个参数,这个参数会替代生成器内部上条 yield 语句返回值。...在 JavaScript 语言中,Thunk 函数指的是将多参数函数替换为一个只接受函数作为参数参数函数(注:这里多参数函数指的是类似 node 中异步 api 风格,callback 为最后入参

3.2K60

es6之Promise是什么「建议收藏」

作用是为Promise实例添加状态改变时函数。then方法一个参数是resolved状态函数,第二个参数(可选)是rejected状态函数。...// 第一个函数完成以后,会将返回结果作为参数,传入第二个函数函数可以采用箭头函数形式,更加简洁 getJSON("/posts.json").then(function(json){...}); 如果没有使用catch()方法指定错误处理函数Promise对象抛出错误不会传递到外层代码,即不会有任何反应。...只要p1、p2、p3之中有一个被rejected,p状态就变成了rejected,此时,第一个被reject实例返回值,会传递给p函数。...率先改变Promise实例返回值,就传递给p函数参数:和Promise.all()方法一样,如果不是Promise实例,就会调用Promise.resolve()方法转化。

40610
领券