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

Sinon单元测试。如何对一个返回promise的函数进行单元测试,该promise将通过回调调用另一个函数?

Sinon是一个JavaScript的测试工具库,用于编写单元测试。它提供了一些功能强大的工具,可以模拟函数的行为、捕获函数的调用和参数,以及断言函数的行为是否符合预期。

对于一个返回Promise的函数,我们可以使用Sinon来进行单元测试。下面是一个示例代码,演示了如何使用Sinon来测试一个返回Promise的函数,该Promise将通过回调调用另一个函数:

代码语言:txt
复制
// 假设我们要测试的函数是一个异步函数,返回一个Promise
function asyncFunction(callback) {
  return new Promise((resolve, reject) => {
    // 在Promise的回调中调用另一个函数
    callback();
    resolve();
  });
}

// 我们的测试用例
describe('asyncFunction', () => {
  it('should call the callback function', () => {
    // 创建一个模拟函数
    const callback = sinon.fake();

    // 使用Sinon的stub方法来替换原函数
    const stub = sinon.stub().returns(Promise.resolve());

    // 调用被测试的函数
    asyncFunction(stub);

    // 断言模拟函数被调用
    sinon.assert.called(callback);
  });
});

在上面的示例中,我们首先创建了一个模拟函数callback,然后使用sinon.stub()方法来替换被测试函数中的回调函数。接着,我们调用被测试的函数asyncFunction,并通过sinon.assert.called()方法来断言模拟函数callback被调用。

这样,我们就可以使用Sinon来对返回Promise的函数进行单元测试,并验证回调函数是否被正确调用。

关于Sinon的更多用法和详细介绍,可以参考腾讯云的产品文档:Sinon官方文档

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

相关·内容

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

Jest与Sinon.js是什么 Jest是FaceBook推出的一个针对JavaScript进行单元测试的库,它提供了断言、函数模拟等API来对你自己编写的业务逻辑代码进行测试后。...编写单元测试 在本章中,我们会针对如何编写单元测试文件进行一个具体的讲解,其中包含: 同步函数测试 异步函数测试 HTTP测试 同时,我们会对当中使用到的Jest和Sinon.js的API会进行简单介绍...('hjava'); // 判断了callback函数的第一次被调用的第一个参数为'hjava' }); 从上面的示例中我们可以看到,针对同步的纯函数,我们可以通过很简单的单元测试模型来验证它的功能。...异步函数测试 异步函数主要分为两种——Callback方式和Promise方式。这两种方式都很简单,下面我们对两种方式进行具体的介绍。详细内容可以见Jest文档中的测试异步代码。...很多人经常都说要对自己的代码进行质量监控,但是又不知道该如何下手。通过这篇文章,你应该学会了如何针对已有代码从零开始编写一套完整的单元测试用例。 如果有任何疑问,欢迎留言或者私信进行沟通与交流。

3.8K00
  • 使用mocha编写node服务单元测试

    可以看到上述代码定义了一个describe组来测试getResult函数的功能,里面有两个测试用例分别测试了入参正常和非法入参的情况。 而测试用例中如何来判断函数是否正常执行呢?...mocha提供了两种方法来解决这个问题: promise 我们可以返回一个promise给mocha框架,等到promise的状态改变时再执行断言: it('测试异步函数', function() {...done it方法的第二个入参是一个执行函数,我们可以给这个函数传入一个done方法,等到异步返回后再去显示地调用done方法,告诉mocha该测试用例执行完毕。...例如当我们需要对一个删除数据的接口进行测试时,我们不能真的去执行数据库删除操作来判断函数是否正常执行。这时候就需要引入sinon来帮助我们替换掉这些难以模拟的逻辑。...,如果我们想要从请求开始来测试node服务接口返回的数据是否正常,也就是说进行一个整体性测试,那么 superTest 就是一个非常好的选择。

    4K20

    Vue 测试速成班

    首先是准备工作,导入函数、实例化对象并设置其参数,让目标对象(这里是一个函数)进入一个可测试的状态。然后操作该功能/方法。最后我们对函数返回的结果进行断言。...这些伪实现可以捕获传递给它们的参数,并用我们要求它们返回的内容进行响应。我们没有为 commit 方法指定返回值,所以它将返回一个空值。...axios.post 将返回一个 promise,该 promise 被解析为带有 body 属性的对象。...这个插件扩展了 Chai 的 to.have.been 属性和 to.have.been.calledWith 方法。 如果我们返回一个 Promise,测试函数将变成异步的。...Mocha 可以检测并等待异步函数完成。在函数内部,我们等待 onModify 方法完成,然后断言伪 commit 方法是否被调用并传入了 post 调用返回的参数。 10.

    2.7K10

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

    done 关键字 当我们的test函数中出现了异步回调函数时,可以给test函数传入一个done参数,它是一个函数类型的参数。...但这里我们思考一种场景:如果使用done来测试回调函数(包含定时器场景,如setTimeout),由于定时器我们设置了 一定的延时(如 3s)后执行,等待 3s 后会发现测试通过了。...“这里我也不举例详细说明了,有这方面需求的同学可以参考Timer Mocks[2] 返回 Promise “⚠️ 当对Promise进行测试时,一定要在断言之前加一个return,不然没有等到Promise...如果代码中使用了Promise,则可以通过返回Promise来处理异步代码,jest会等该promise的状态转为resolve时才会结束,如果promise被reject了,则该测试用例不通过。...我们在测试中也主要是用到了mock函数提供的以下三种特性: 捕获函数调用情况 设置函数返回值 改变函数的内部实现 下面,我将分别介绍这三种方法以及他们在实际测试中的应用。

    5K20

    掌握JavaScript的异步编程,让你的代码更高效

    它就像一个单线程的小管家,时刻关注着各种事件,并在合适的时机执行相关的回调函数。每当一个异步操作开始时,小管家会安排一个回调函数,等操作完成后再来处理。这种机制让你的应用不会因为等待而卡住。...回调函数:灵活但易乱的工具 回调函数是异步编程中常见的操作,把一个函数作为参数传给另一个函数,等到某个事件发生时再调用它。...同样将帖子响应解析为JSON格式的数据。 最后返回一个对象,包含用户信息和帖子数据。 这个例子展示了如何使用await关键字顺序执行多个依赖异步操作。...使用await等待所有请求完成,然后分别解析每个响应的JSON数据。 将解析后的数据组合成一个对象,并返回这个对象。 这个例子展示了如何使用Promise.all并行处理多个异步操作。...订阅时可以指定三个回调函数:一个用于处理接收到的数据,一个用于处理错误,另一个用于处理数据流完成的情况。

    13210

    对 React 组件进行单元测试

    作为一种经典的开发和重构手段,单元测试在软件开发领域被广泛认可和采用;前端领域也逐渐积累起了丰富的测试框架和最佳实践。 本文将按如下顺序进行说明: I. 单元测试简介 II....单元测试简介 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。 简单来说,单元就是人为规定的最小的被测功能模块。...', function() { ... }); ... }); spy 正如 spy 字面的意思一样,我们用这种“间谍”来“监视”函数的调用情况 通过对监视的函数进行包装,可以通过它清楚的知道该函数被调用过几次...有时候会使用stub来嵌入或者直接替换掉一些代码,来达到隔离的目的 一个stub可以使用最少的依赖方法来模拟该单元测试。...比如一个方法可能依赖另一个方法的执行,而后者对我们来说是透明的。好的做法是使用stub 对它进行隔离替换。这样就实现了更准确的单元测试。

    4.3K40

    从0到1实现Promise

    如果在上一个Promise的then()方法回调函数的执行过程中发生了错误,那么会将其捕获到,并作为返回的Promise的onRejected函数的参数传入。...作为reject(reason)进行决议,于是会被下一个then()方法的onRejected回调函数调用,而catch只是写了一个特殊的then(null, onRejected)而已。...所以,我们在写Promise的链式调用的时候,在then()中可以不传onRejected回调,只需要在链式调用的最末尾加一个catch()就可以了,这样在该链条中的Promise发生的错误都会被最后的...有可能是普通值,有可能是thenable,也有可能是另一个Promise,所以调用resolvePromise进行解析。...的后面就停掉,完全不去执行链式调用后面所有回调函数呢? 我们自己封装一个Promise.stop方法。

    94610

    从0到1实现Promise前言正文结束

    如果在上一个Promise的then()方法回调函数的执行过程中发生了错误,那么会将其捕获到,并作为返回的Promise的onRejected函数的参数传入。...通过let x = onFuifilled(self.value) 或者 let x = onRejected(self.reason)拿到then()方法回调函数的返回值,然后调用self.resolvePromise...作为reject(reason)进行决议,于是会被下一个then()方法的onRejected回调函数调用,而catch只是写了一个特殊的then(null, onRejected)而已。...所以,我们在写Promise的链式调用的时候,在then()中可以不传onRejected回调,只需要在链式调用的最末尾加一个catch()就可以了,这样在该链条中的Promise发生的错误都会被最后的...有可能是普通值,有可能是thenable,也有可能是另一个Promise,所以调用resolvePromise进行解析。

    1K30

    前端测试驱动开发模式(TDD)快速入门

    主要用来mock一些东西,比如可以用sinon mock一个假的函数,sinon也可以返回这个函数执行与否。...) const assert = chai.assert // 从chai中引出assert 复制代码 如何实施TDD 如何写一个单元测试 首先我们看一个简单的单元测试代码: describe('测试navigateTo...,第一个参数是范围的名字,第二个是一个回调函数,其中可以放单元测试代码 it()里写单元测试的代码,第一个参数还是这个测试的名字,第二个回调函数中放入单元测试代码 assert 就是断言代码执行后的结果是什么...let fn = sinon.fake() //生成一个模拟函数 assert(fn.called) //断言这个函数是否被执行 复制代码 小结 本文只是对Tdd的一个简单介绍,适用于快速入门。...mocha,chai,sinon的一些高级的用法,还需要通过实践去学习。 另,本文只是对但纯js的测试,react,vue和小程序都有他们自己的ui测试的方案。

    2.5K20

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

    navigator.geolocation.getCurrentPostion() # chrome API 异步获取当前位置 Callback 回调函数 it('the data is peanut...但这种方式侵入性比较强,对测试语句不友好且违背了 Given/When/Then 的三段式套路,就像回调地狱一样的道理,如果让 done() 充斥着测试那么代码也就变得混乱。...但也有一个不错的点,可以通过 Promise 的 .resolve() 和 .reject() 方法使测试分别验证正常或异常的情况。...未完待续…… ## 单元测试基础 ### 单元测试与自动化的意义 ### 为什么选择 Jest ### Jest 的基本用法 ### 该如何测试异步代码?...架构 ### 如何对 Vuex 进行单元测试 ### Vue组件和Vuex store的交互 ## Vue 应用测试策略 ### 单元测试的特点及其位置 ### 单元测试的关注点 ### 应用测试的测试策略

    2.2K20

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

    ---- 单元测试 单元测试其实在我的实际开发中并没有用到过,但却经常听说,接下来进行单元测试的学习 Jest 和 Vue Test Utils 的基础和进阶全覆盖 TDD,测试驱动开发,一种全新的开发方式...vscode 并且安装了 jest 插件,那么可以实时并且直观的看到测试是否通过 Jest 实现异步测试 回调方式 // callback const fetchUser = (cb) => {...Mock 的几大功能 创建 mock function,在测试中使用,用来测试回调 手动 mock,覆盖第三方实现,狸猫换太子 三大 API 实现不同粒度的时间控制 函数测试 function mockTest...axios.get.mockReturnValue(Promise.resolve({ data: { username: 'warbler' } })) 还用更简单的方式,直接返回一个 Promise...的 resolve axios.get.mockResolvedValue({ data: { username: 'warbler' } }) 如果多处对同一个模块进行 mock,会造成大量重复的工作

    1.3K20

    使用 Node.js 实现文件流转存服务

    所以我们通过Javascript的函数将捕获下载内容的代码封装成一个函数。...有个这个函数,我们就只需要在接收数据的回调函数中将buffer都通过pushBuf函数写入缓存即可。 准备发送 目前下载数据包和缓存都已经准备就绪,接下来就是准备进行发送分片的操作了。...但是,还依然存在以下问题: 如何连续不断的从缓存中获取分片 如何发送分片 单个分片如果上传失败,如何重试 如何在所有分片都上传完成之后触发一个回调 如何实现多个分片并行上传 下面将逐步讲解思路,并提供相关实现代码...所以我们也可以使用这样的逻辑来进行分片的发送,当请求出现错误的时候,在catch函数内判断重试次数,次数若大于0,则再返回一个递归的send函数,直到次数等于0,直接用Promise.reject将异常抛出...如何在所有分片都上传完成之后触发一个回调 到目前为止,整个服务的核心部分已经差不多了,send函数无论怎么调用,都会返回Promise对象,所以在所有分片都上传完成之后触发一个回调也就很容易了,只需要将所有的

    3.3K10

    React + Redux Testing Library 单元测试

    Callback 回调函数 it('the data is peanut butter', done => { function callback(data) { expect(data)....但这种方式侵入性比较强,对测试语句不友好且违背了 Given/When/Then 的三段式套路,就像回调地狱一样的道理,如果让 done() 充斥着测试那么代码也就变得混乱。...在单元测试中,通常我们希望将重点放在作为独立单元进行测试的组件上,并避免间接断言其子组件的行为。...如何对 Redux 进行单元测试 得益于 Redux 能够将 React 应用的共享状态进行隔离,我们的代码也因此变得更加结构化且易于维护,Redux 中的 reducer、action 和 selector...然后我们就可以使用 Jest 模拟一个 action 的行为再传给 store,而 actionClick 这个伪造函数能够让我们去断言该 action 是否被调用过。

    2.4K10

    2021 年 Node.js 开发人员学习路线图

    回调(Callback):回调是特定任务执行完成后调用的函数,不影响其它代码的同时执行,避免了异步处理产生阻塞。鉴于 Node.js 中需处理大量的异步任务,因此回调无处不在。...授权以键值对(也称为令牌)形式提供,用户必须提供键值进行验证。...该技术尤其适用于大规模数据和大量网络调用的情况,通过在群集中添加更多的服务器实现缓存容量的增量扩展和扩容。Redis 是目前最广为使用的 分布式内存,推荐进一步了解 Memcached。...Mocha:为 Node 应用提供原始标准的单元测试框架,支持回调等异步操作,支持使用高度可扩展和自定义断言的 Promise。...推荐阅读:下面资料分别介绍了如何使用 Sinon 和 Jasmine 实现 Mocking 测试: Sinon https://stackabuse.com/using-mocks-for-testing-in-javascript-with-sinon-js

    2.5K20

    Angular2 之 单元测试

    通过将测试代码放到特殊的异步测试区域来运行,async函数简化了异步测试程序的代码。 接受无参数的函数方法,返回无参数的函数方法,变成Jasmine的it函数的参数。...和async一样,它也接受无参数函数并返回一个函数,变成Jasmine的it 函数的参数。 fakeAsync函数通过在特殊的fakeAsync测试区域运行测试程序,让测试代码更加简单直观。...你仍然可以将接受 done回调的函数传给it。 但是,你必须链接承诺、处理错误,并在适当的时候调用done。...---- 多次调用同一个异步方法 相信大家对这段单元测试的代码很熟悉,这里就是模拟多次调用同一个方法时,返回不同的值。 这里是同步方法的模拟返回数据,那么异步方法同样可以。...虽然第一个、第二个expect通过了,但是第三个无论如何也通不过。

    5.5K20

    前端单元测试那些事

    Wrapper 是一个包括了一个挂载组件或 vnode,以及测试该组件或 vnode 的方法, 通过用mount(component,option)来挂载组件,得到wrapper包裹器,可通过 wrapper.vm...为了测试这个方法,我们应该做到: 我们不需要实际调用axios.get方法,需要将它mock掉 我们需要测试是否调用了axios方法(但是并不实际触发)并且返回了一个Promise对象 返回的Promise...对象执行了回调函数 注:有时候会存在一种情况,在同个组件中调用同个方法,只是返回值不同,我们可能要对它进行多次不同的mock,这时候需要在beforeEach使用restoreAllMocks方法重置状态...mock的目的: 设置函数返回值 获取获函数调用情况 改变原本函数的内部实现 4. ️...踩坑点 1.触发事件 - 假设组件库使用的是iview中对提供的@change事件,但是当我们进行 wrapper.trigger('change')时,是触发不了的。

    4.5K40

    2021年Node.js开发人员学习路线图

    回调(Callback):回调是特定任务执行完成后调用的函数,不影响其它代码的同时执行,避免了异步处理产生阻塞。鉴于 Node.js 中需处理大量的异步任务,因此回调无处不在。...授权以键值对(也称为令牌)形式提供,用户必须提供键值进行验证。...该技术尤其适用于大规模数据和大量网络调用的情况,通过在群集中添加更多的服务器实现缓存容量的增量扩展和扩容。Redis 是目前最广为使用的 分布式内存,推荐进一步了解 Memcached。 ?...Mocha:为 Node 应用提供原始标准的单元测试框架,支持回调等异步操作,支持使用高度可扩展和自定义断言的 Promise。...推荐阅读: 下面资料分别介绍了如何使用 Sinon 和 Jasmine 实现 Mocking 测试: Sinon https://stackabuse.com/using-mocks-for-testing-in-javascript-with-sinon-js

    2.6K20

    TW洞见〡为什么你的Angular代码很难测试?

    来看一个简单的例子,我们想创建一个简单的邮箱地址验证的directive,它要实现的功能是,当焦点从邮箱地址输入框移出的时候,对输入框中的邮箱地址进行验证,如果验证失败,则向输入框添加一个样式表示输入的地址不合法...4 使用Promise处理Ajax的返回值, 而不是传递回调函数 Angular中所有的Ajax请求默认都返回一个Promise对象,不建议将处理Ajax返回值的逻辑通过回调函数的形式传递给发送http...请求的service,而应该是在调用service的地方利用返回的promise对象来决定如何处理。...让我们通过下面的例子来感受一下: ? 这里的处理办法是将快递地址验证失败或成功之后的处理函数都传给了deliveryService,当验证结果从服务器端返回之后,相应的处理函数会被执行。...正确的打开方式应该是这样的:service的API只需要返回promise,对应的处理函数的绑定在这个返回的promise上,这样我们只需要mock那个service的接口让它返回一个我们期望的promise

    1.5K30
    领券