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

Sinon存根错误:“尝试包装已包装的post”,即使我正在恢复

Sinon是一个流行的JavaScript测试工具,用于创建和管理测试中的存根(stubs)、模拟(mocks)和间谍(spies)。在使用Sinon进行测试时,有时可能会遇到"Sinon存根错误:“尝试包装已包装的post”"的问题。

这个错误通常是由于在测试中多次包装(wrap)了同一个函数或方法导致的。Sinon的包装功能允许我们在测试中替换原始函数或方法,并对其进行模拟或监视。然而,如果我们尝试对已经被包装的函数再次进行包装,就会出现这个错误。

解决这个问题的方法是在每个测试用例之前,使用Sinon的restore()方法来还原所有已经包装的函数。这样可以确保每个测试用例都从一个干净的状态开始,避免重复包装的问题。

以下是一个示例代码,展示了如何使用Sinon进行函数包装和还原:

代码语言:javascript
复制
const sinon = require('sinon');
const assert = require('assert');

// 假设我们有一个名为post的函数需要进行测试
function post(data) {
  // 执行一些操作并返回结果
  return 'Response';
}

// 创建一个测试用例
describe('Test post function', () => {
  let postStub;

  beforeEach(() => {
    // 在每个测试用例之前创建一个存根
    postStub = sinon.stub().returns('Mocked Response');
  });

  afterEach(() => {
    // 在每个测试用例之后还原存根
    postStub.restore();
  });

  it('should return mocked response', () => {
    // 使用存根替换原始函数
    const originalPost = post;
    post = postStub;

    // 执行测试
    const result = post();

    // 断言结果是否符合预期
    assert.strictEqual(result, 'Mocked Response');

    // 还原原始函数
    post = originalPost;
  });

  it('should return original response', () => {
    // 执行测试
    const result = post();

    // 断言结果是否符合预期
    assert.strictEqual(result, 'Response');
  });
});

在上面的示例中,我们使用sinon.stub()方法创建了一个存根,并使用sinon.stub().returns()方法指定了存根的返回值。在每个测试用例之前,我们都会创建一个新的存根,并在每个测试用例之后使用restore()方法还原存根。

这样,我们就可以在测试中使用存根来替换原始函数,并根据需要指定存根的行为。通过还原存根,我们可以确保每个测试用例都以干净的状态开始,避免了"尝试包装已包装的post"错误。

关于Sinon的更多信息和用法,请参考腾讯云的相关产品和产品介绍链接地址。

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

相关·内容

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

来源:http://www.ltesting.net 测试驱动开发(Test-Driven Development)是一种软件开发的思维和方法,我的理解是它是一种开发的循环,先写测试代码,再用最小的代码实现这个测试...这样做有以下优缺点: 优点 在开始可以比较明确自己要做什么,把错误暴露在整个开发流程比较靠前的位置,修改的成本也比较小 在之后对代码优化的过程中,因为有测试代码的存在,可以更好的优化代码,优化完之后再执行一遍代码...throw出错误,再用assert捕获这个错误,这样可以比较方便的测试入参是否符合预期。...(badFn, 'this.commonDirectFn is not a function') // 再把包装后的函数传入throws }) 复制代码 使用sinon模拟函数 如果需要模拟一个函数...,可以用sinon去模拟,使用方法:sinon.fake(),并且课已通过这个sinon的called方法判断函数是否被执行。

2.5K20

单元测试初体验

下面我主要描述一下搭建这套单元测试环境和开发的所用技术,和具体的 demo。...测试辅助工具 Sinon Sinon 是一个独立的 JavaScript 测试 spy, stub, mock库,没有依赖任何单元测试框架工程。...您可以通过打开浏览器并访问Karma Web服务器正在侦听的URL来手动捕获任何浏览器(默认情况下为http://localhost:9876/)。...sinon.js 中 spy 主要用来监视函数的调用情况,sinon 对待监视的函数进行 wrap 包装,因此可以通过它清楚的知道,该函数被调用过几次,传入什么参数返回什么结果,甚至是抛出的异常情况。...var spy = sinon.spy(orginObj, 'launch'); spy.restore(); 当 spy 使用完成后,切记把它恢复成原始函数,就像上边例子中最后一步那样。

1.6K20
  • 系统集成的演变历史

    话虽如此,RPC有一个小问题,我将其归因于它是第一次尝试解决当时非常新的问题:实现是依赖于语言的。...4、服务器存根将依次分解包(这也是用于从接收到的序列化包中重新创建参数的代码)。 5、服务器存根将执行服务器代码,传递接收到的(现在已解组)参数。...CORBA,朝着正确的方向迈出了一步 CORBA诞生于90年代早期,作为弥补RPC和其他类似尝试留下的鸿沟的尝试。...他的建议定义REST来利用HTTP的特性,例如响应代码(2xx和3xx表示成功响应,4xx表示客户端错误,5xx表示服务器错误)、动词(例如GET、POST、PUT等)和其他。...它也可以作为一个简单的“数据库包装”在某种意义上你创建一个服务,查询数据库和界面世界GraphQL,它也可以作为一个积分器,从多个远程数据源获取数据并结合在一起之前发送回客户机的响应。

    1.3K30

    【韧性架构设计】软件韧性:从意外中恢复的 7 个必备因素

    这里的重点是,即使这是一项手动任务,它对于弹性软件也非常重要。想象一下,您正在更改电子商务网站的支付网关。...当箱子从 QC 站运送到包装站时,将创建装运并打印运输标签。尽管盒子从 QC 到包装站需要几秒钟的时间,但这足以让我们创建货物。如果某些发货失败,有一个简单的重试选项,即按需致电快递员。...例如,API 中的 GET 操作是幂等的。这对于设计弹性系统很重要,让我用一个例子来解释一下。 您正在设计一个 API 来将消息标记为已读。...无论调用多少次 API 将单条消息标记为已读,第一个都将其从未读设置为已读,并且所有其他都不会更改状态。 这是一个易于理解的幂等性示例。...类似于您家的断路器,如果您的软件系统多次无法访问另一个软件系统,它会破坏标记它打开的电路。它会定期检查其他系统是否已恢复。 当另一个系统恢复时,电路再次闭合。微软博客对断路器模式有很好的解释。

    98230

    Swift基础 基础知识

    如果隐式解包的可选选项为nil,并且您尝试访问其包装值,您将触发运行时错误。结果与您在不包含值的正常可选选项后放置感叹号完全相同。...由于makeASandwich()可以抛出错误,函数调用被包装在try表达式中。通过将函数调用包装在do语句中,抛出的任何错误都将传播到提供的catch子句。...除了在运行时验证您的期望外,断言和先决条件也成为代码中有用的文档形式。与上面错误处理中讨论的错误条件不同,断言和先决条件不用于可恢复或预期错误。...您可以在原型和早期开发期间使用fatalError(_:file:line:)函数,通过编写fatalError("Unimplemented")作为存根实现,为尚未实现的功能创建存根。...由于致命错误永远不会被优化,与断言或先决条件不同,您可以确保如果遇到存根实现,执行总是会停止。

    15500

    【读码JDK】-java.lang包介绍

    基本类型float的包装类型 Throwable 所有错误和异常的超类。...通常,编译器会捕获此错误; 如果类的定义不兼容地更改,则此错误只能在运行时发生 IllegalAccessException 当应用程序尝试反射创建实例(数组除外),当前正在执行的方法无法访问指定类的字段...当调用发不正确的调用方法时,抛出该异常 IllegalMonitorStateException 抛出此异常表示线程已尝试在对象的监视器上等待,或者在没有指定监视器的情况下通知在对象监视器上等待的其他线程...搜索的类定义在编译当前正在执行的类时存在,但无法再找到该定义 NoSuchFieldError 如果应用程序尝试访问或修改对象的指定字段,并且该对象不再具有该字段,则抛出该异常。...抛出null ,它是Throwable值 NumberFormatException 抛出以表示应用程序已尝试将字符串转换为其中一种数字类型,但该字符串没有适当的格式 Number 提供数字值转换为基本数据类型

    1.6K20

    Java包含两种异常checked异常和unchecked异常

    一些Java书籍(如Suns Java Tutorial)中建议在遇到可恢复的错误时采用checked异常,遇到不可恢复的异常时采用unchecked异常。...我的个人观点是,如果你只是包装异常但并不提供更多信息,那为什么要包装它呢?try-catch块就成了多余的代码,没有做任何有意义的事。...下面是unchecked代码的包装版本。注意readNumberFromUrl()方法不声明抛出ApplicationException,即使它可能抛出该异常。     ...最近我们尝试在一个较大的项目中使用unchecked异常,效果还不错。错误处理被集中在了少数几个类中。会有需要本地错误处理的地方,而不是将异常传播给主错误处理代码。但是这种地方不会很多。...总之,我建议使用unchecked异常。至少在一个工程中尝试过。我总结了以下原因:   Unchecked异常不会使代码显得杂乱,因为其避免了不必要的try-catch块。

    85520

    Jira API的踩坑记

    本来我以为在国内有很多公司都在用jira, 这里面少不了的API接口进行功能性的封装,肯定会有中文的文档结果经过几次尝试搜索之后,我终于确认jira API是没有中文文档的。...我使用的一键翻译软件是浏览器自带的尝试过一些,他们总是会把接口请求路径中的英文单词也翻译成汉字,这简直就是不能看。...而且这些包装结构的作用范围并没有在文档中标识出来,导致我想去查一个参数,并不知道两个地方现在多个地方到底哪个地方有用只能去一各一各的尝试,虽然对接文档的工作已经完成了,但是对于文档中所标记的参数以及传参格式部分字段依然稀里糊涂...会让我付出更多的时间和精力去纠正这些错误,如果再碰到非常复杂的包装格式,就更让人恼火了。回到刚才提到过的Jira api文档,有非常多个版本,如果文档出现错误,修复起来肯定也是比较多的。...真是让我感动的痛哭涕零,这都什么玩意儿。 POST PUT 在我之前的工作当中,主要接触的还是get和post接口。对于其他HTTP请求方式并不十分了解,也不太清楚这其中的规范。

    1.5K20

    如何撰写精彩的技术博客文章

    即使这个想法以前被写过,你也可以用自己的视角,来阐述在你这种特定环境下的不同做法。 2.我的想法不够有趣。 我的很多朋友和同事都不写,因为他们担心他们的结论可能很无聊或显而易见。 这很正常啊!...即使说了这么多,在最后也很难预测什么样的主题能成为一个精彩(火)的文章,哪样的不会,并且往往是坚持写或换个文章,而不是一个精彩的主题。 我的主要建议是尝试写几个不同的东西,看看哪些有用。...关于奖励,尝试将你的文章发布到相关的技术网站中,以便于他们帮助分享你的文章 - 由此考虑,我选择了 freeCodeCamp,因为我认为这篇文章与他们的读者有关。...如果你也想这样做,请按以下方式提交你的文章。你感兴趣的领域的技术网站也可能正在寻找文章,所以不要害怕联系! 宣传 虽然你已经发布了文章,但是还没完事!...因此,即使你的第一篇,第二篇或第三篇文章没有成功,也要继续尝试新的东西,把你的想法写出来,并随着时间的推移而改进。 世界想要听到你要说的话。 去告诉他们!

    1.1K70

    java setattribute_java – HttpSession setAttribute并不总是插入新对象「建议收藏」

    我正在从WLS10g和 JavaEE6升级到WLS12c和JavaEE7....我注意到HttpSession.setAttribute的工作方式有所不同.在WLS10中,任何已存储在某个键下的对象都将被替换....更新2015-09-30: 向Oracle提交的错误报告.我尝试过wero建议的过滤器想法.似乎Weblogic期望来自过滤器链的对象属于weblogic.server.internal.ServletRequestImpl...类,因为当我将其包装并将包装器发送到过滤器链时,我从内部Weblogic类获得了ClassCastException....我还检查了Gimby建议的配置选项.我找不到会议的任何适用选项.我们部署到单个服务器并使用内存作为会话持久性设置. 更新2016-02-03: Oracle已将错误报告关闭为“不是错误”.

    41810

    Kotlin版图解Functor、Applicative与Monad

    “大人物可以使用具有任意数量参数的函数,”它说。 “装备了 ($) 与 (*) 之后,我可以接受具有任意个数未包装值参数的任意函数。 然后我传给它所有已包装的值,而我会得到一个已包装的值出来!...Monad 增加了一个新的转变。 Functor 将一个函数应用到一个已包装的值上: ? Applicative 将一个已包装的函数应用到一个已包装的值上: ?...如果我们喂给它一个已包装的值呢? ? 我们需要使用 ))= 来将我们已包装的值塞进该函数。 这是 ))= 的照片: ?...functor: 可通过 fmap 或者 ($) 将一个函数应用到一个已包装的值上。 applicative: 可通过 (*) 或者 liftA 将一个已包装的函数应用到已包装的值上。...monad: 可通过 ))= 或者 liftM 将一个返回已包装值的函数应用到已包装的值上。

    1.2K20

    Java一分钟之-Spring Cloud Netflix Hystrix:容错管理

    断路器能够监控服务调用的健康状况,当错误率超过阈值时自动打开,阻止进一步的请求;线程隔离确保了一个依赖的故障不会拖垮整个应用;fallback 提供了降级策略,当主逻辑失败时,可以执行备选逻辑。...断路器一直打开问题描述:即使服务恢复,断路器仍保持打开状态。...解决方案:检查Hystrix的配置,合理设置断路器的恢复策略,如circuitBreaker.sleepWindowInMilliseconds,确保断路器在一段时间后尝试重新关闭。2. ...Fallback策略不当问题描述:Fallback方法处理不当,返回不恰当的默认值或错误信息。...我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

    14110

    创建 REST 服务简介

    REST 是面向资源的。通常,资源由 URL 标识并使用基于 HTTP 方法的操作,例如 GET、POST、PUT 和 DELETE。 REST 通常有少量开销。...虽然它可以使用 XML 来描述数据,但它更常用的是 JSON,它是一种轻量级的数据包装器。 JSON 使用标签标识数据,但标签没有在正式的模式定义中指定,也没有明确的数据类型。...API 管理工具生成实现类的存根版本,然后可以扩展它以包含必要的应用程序逻辑。 (逻辑当然可以调用此类之外的代码。)%REST.Impl 类提供了可以调用的方法,以便设置 HTTP 标头、报告错误等。...在每种情况下,这些存根方法都具有遵循 REST 服务规范定义的契约的签名。请注意,对于 options 方法, 不会生成存根方法供实现。相反,%CSP.REST 类会自动执行所有选项处理。...如果文件已存在,则将其覆盖。

    58120

    Jenkins 版本更新历史

    v2.204.1 (2019-12-28) 将鼠标悬停在侧栏链接上时,显示带有完整链接名称的工具提示。 防止错误的子任务提供者使构建永久运行。 修复"插件管理-已安装"列表中卸载列的排序。...v2.190.3 (2019-11-20) 稳定性: 不允许用户使用 POST 在需要提交表单的 URL 上重新提交请求,因为那样无论如何都会失败。...内部: 发生错误时,hudson.util.ProcessTree.OSProcess#getEnvironmentVariables 返回 null ,即使它不应该发生也是如此。...解决使用 "记住我" 时的性能问题。(由 2.160 引入的缺陷回归) 测试代理配置时不要抛出异常。...这简化了不使用更新中心的专用安装方案的兼容性,例如当从带有某些插件的预包装 Docker 镜像运行 Jenkins 时。

    3.5K30

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

    通过then和catch方法,你可以链式地处理一连串的异步操作,这让代码变得更清晰、更易读。Promise的三种状态——等待中、已完成、已拒绝,也让你更容易掌控异步操作的流程。...5、取消请求 在Web开发中,有时候我们需要在特定条件下取消一个正在进行的网络请求。比如用户快速切换页面或提交新请求时,取消之前的请求可以提升性能和用户体验。...const post of fetchPosts()) { console.log('Post:', post); } })(); 在这个例子中,我们创建了一个名为fetchPosts...例如: const assert = require('assert'); const sinon = require('sinon'); // 这里无需引入 fetch,因为我们使用 sinon.stub...记住,技术的学习和应用是一个不断积累和优化的过程,只有不断实践和总结,才能真正掌握其中的精髓。 不要害怕挑战,勇敢尝试这些新技术,让你的前端开发技能更上一层楼吧!

    13210

    Promise:为什么没有取消?

    即使如此,文章最后部分,还是会提供一些方法,来实现一下cancle。 设计的哲学 设计理念 Promise的设计初衷是为了简化回调函数的使用,使得处理异步操作的代码更加简洁和可读。...Rejected(已拒绝) :表示异步操作失败,并返回了一个原因(错误)。 状态转换规则如下: 从Pending状态可以转换到Fulfilled状态。...Rejected(已拒绝) :状态不可变。 Cancelled(已取消) :状态不可变。 这种增加的复杂性会导致以下问题: 状态转换冲突:需要明确地处理在Pending状态下多次转换的情况。...例如,使用AbortController来取消网络请求,或者使用自定义的Promise包装器来支持取消。.../post/7373986431850872869

    16310

    怎样编写更好的 JavaScript 代码

    我不知道 TS 本质上是否能比 JS 更少出现“错误”,不给我强烈认为,迫使开发人员首先定义接口和 API,从而产生更好的代码是很有必要的。...... } 也可以直接 await 一个 Promise,因为 async 函数实际上只是一个花哨的 Promise 包装器。...在上一份工作中,我带领一个团队花了几个月的时间尝试将 R 语言中的 for-loops 转换为自动并行代码。这基本上是一个不可能的任务,只有通过等待深度学习技术的改善才能解决。...如果你尝试执行多次迭代,则处理器可能会根据不准确的值进入错误地分支,从而使结果无效。如果这是 C 代码,我们将会进行不同的讨论,因为使用情况不同,编译器可以使用循环实现相当多的技巧。...Sinon 是一个可以做很多事的库,但只有少数的事情做得超级好。具体来说,当涉及到 Spies 和 Stubs 时,sinon非常擅长。功能集丰富而且语法简洁。

    1.3K30

    【软件架构】支持大规模系统的设计模式和原则

    由于这种性质,我无法深入研究每个主题,而只是提供一个概述。也就是说,在每个主题中,我都尝试添加有用的链接,指向关于该主题的更全面的资源。 所以让我们深入研究吧!...它是通过使用 if 检查功能标志是否已启用(或者,通过检查相关的 kill-switch 标志是否已禁用)的条件来控制功能来实现的。...此外,如果我们启用了功能标志并且我们在系统中看到了新错误,则很容易禁用该标志并“恢复正常”,这从操作的角度来看是一个巨大的胜利。 舱壁(Bulkhead) 隔板是船底隔间之间的分隔墙或屏障。...我们还避免共享配置:不同的服务应该有自己的配置设置,即使它需要某种重复,以避免一个服务中的配置错误影响不同服务的情况。...一个示例可以是在我们正在运行的 A/B 测试中发布的指标,以提供有关分配到实验不同单元的用户的见解 小轶事:在我为 Netflix 工作的日子里,我和我的团队所做的一件事是开发 Watson,使团队能够通过创建程序化运行手册从已知场景中自动修复他们的服务

    58120

    2019-1-29-wcf入门(9)

    本文demo已上传至github:xinyuehtx/WCFdemo 这个博客会介绍如何设置服务的异常回馈 ---- 多进程之间调试,或者是客户端/服务器联调,很麻烦的一点是出了异常如何定位?...这里我们通过它将方法中的异常,和方法名称做了封装。 ? 在服务实现中,我们通过抛出FaultException,将ServiceFault包装,传递给客户端 ?...可以看到异常成功输出 错误协定风险 聪明的同学都已经注意到,我们刚刚试验的操作协定是请求答复模式的(同步方法)。那么对于单向模式会如何呢? 我们尝试将IsOneWay设置为True ?...小结 我们研究了WCF服务的错误协定,其特点有 可以将服务端的指定错误回馈客户端,通过简单包装可以传递所有托管异常的基本信息 协定传递的对象需要可以被数据协定序列化 不能处理单向操作 参考链接: 如何:...post/wcf%E5%85%A5%E9%97%A8-9.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

    32020
    领券