首页
学习
活动
专区
工具
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.jsAPI会进行简单介绍...('hjava'); // 判断了callback函数第一次被调用一个参数为'hjava' }); 从上面的示例中我们可以看到,针对同步函数,我们可以通过很简单单元测试模型来验证它功能。...异步函数测试 异步函数主要分为两种——Callback方式和Promise方式。这两种方式都很简单,下面我们两种方式进行具体介绍。详细内容可以见Jest文档中测试异步代码。...很多人经常都说要对自己代码进行质量监控,但是又不知道如何下手。通过这篇文章,你应该学会了如何针对已有代码从零开始编写一套完整单元测试用例。 如果有任何疑问,欢迎留言或者私信进行沟通与交流。

3.7K00

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

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

3.9K20

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函数提供以下三种特性: 捕获函数调用情况 设置函数返回值 改变函数内部实现 下面,我分别介绍这三种方法以及他们在实际测试中应用。

4.9K20

React 组件进行单元测试

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

4.2K40

从0到1实现Promise

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

88310

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

如果在上一个Promisethen()方法函数执行过程中发生了错误,那么会将其捕获到,并作为返回PromiseonRejected函数参数传入。...通过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进行解析。

95830

前端测试驱动开发模式(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.4K20

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.3K10

Angular2 之 单元测试

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

5.5K20

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.4K20

前端单元测试那些事

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.3K40

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,当验证结果从服务器端返回之后,相应处理函数会被执行。...正确打开方式应该是这样:serviceAPI只需要返回promise,对应处理函数绑定在这个返回promise上,这样我们只需要mock那个service接口让它返回一个我们期望promise

1.5K30

比较全面的Promise使用方式

本质上 Promise一个函数返回对象,我们可以在它上面绑定函数,这样我们就不需要在一开始把函数作为参数传入这个函数了。...假设现在有一个名为 createAudioFileAsync() 函数,它接收一些配置和两个函数,然后异步地生成音频文件。一个函数在文件成功创建时被调用另一个则在出现异常时被调用。...createAudioFileAsync(audioSettings, successCallback, failureCallback) 更现代函数返回一个 Promise 对象,使得你可以将你函数绑定在...即使异步操作已经完成(成功或失败),在这之后通过 then() 添加函数也会被调用通过多次调用 then() 可以添加多个函数,它们会按照插入顺序进行执行。...对象,从而形成另一个异步操作,这样的话,在 promise2 上新增函数会排在这个 Promise 对象后面。

87420
领券