问题标签 [sinon]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
8747 浏览

javascript - Sinon.js 存根和测试以对象为参数的外部函数调用,稍后由 ref 修改

我正在寻找测试我的函数对另一个函数的调用,特别是作为对象的参数。

问题是 sinon.js 似乎存储了对其参数数组中给出的对象参数的引用,这自然是意料之中的。但是,这会在稍后由 ref 修改参数时产生问题,这会在调用函数时更改这些参数的表观值。

对这种情况进行单元测试的最佳方法是什么?

这是一个人为的例子:

http://jsfiddle.net/xtfQu/

我可以想到围绕这个“问题”的各种技巧。有没有一种更简洁的方法,不涉及克隆对象或仅仅为了让 sinon 工作而修改我的生产代码?

0 投票
1 回答
157 浏览

backbone.js - 为什么它调用原始方法?

我正在针对我的主干应用程序编写茉莉花规范。但是,我遇到了这个问题。不知道为什么我的间谍功能没有被调用。我想确保模型何时出现changed,它应该调用#render

这是我的主干观点:

这是我的茉莉花规格:

让我感到困惑的另一件事是,当这个规范运行时,它实际上调用了原始方法。始终显示控制台日志。任何人都可以帮助我吗?

更新

正如莱昂纳多在下面回答的那样,我通过以下更改进行了更改:

它可以工作,但问题是它调用了原始方法。我只是想知道为什么?

0 投票
1 回答
569 浏览

javascript - 如何对编译后的代码进行单元测试(使用 QUnit 和 Sinon)(闭包编译器高级编译)

我使用 QUnit 为我的未编译代码创建了一些单元测试,并在需要时使用 sinon 模拟函数。但问题是,在闭包编译器的高级编译之后,函数名称发生了变化,因此单元测试用例不适用于编译代码。

我在这里阅读了https://groups.google.com/forum/#!topic/closure-library-discuss/uU2t2xbVtlc,它不需要测试编译的代码。但我仍然想这样做。

所以,我的问题是我是否可以为编译代码移植这些测试用例。如果是,那我该怎么做?

0 投票
2 回答
8050 浏览

javascript - 在 Node.js 中使用 Sinon.js 模拟 Postgres 进行单元测试

我很难弄清楚如何使用 sinon 来模拟对我正在测试的模块所要求的 postgres 的调用,或者是否有可能。

我不是在尝试测试 postgres 模块本身,只是我的对象以确保它按预期工作,并且它正在调用它在这种情况下应该调用的内容。

我想问题是节点的要求设置,因为我的模块需要 postgres 模块才能访问数据库,但是在这里我不想运行集成测试,我只想确保我的代码独立工作,并不真正关心数据库在做什么,我将把它留给我的集成测试。

我见过一些人设置他们的函数有一个可选参数来发送模拟/存根/假的函数,测试它的存在,如果它存在,在所需的模块上使用它,但这对我来说似乎是一种气味(我是节点的新手,所以也许这不是)。

我宁愿模拟这一点,而不是在可能的情况下尝试劫持需求。

一些代码(请注意,这不是真正的代码,因为我正在使用 TDD 运行并且该函数实际上并没有做任何事情,函数名称是真实的)

测试设置

示例函数

像这样包裹 postgres 模块可能看起来有点有趣,但是有一些设计,因为这个应用程序将有几个“提供程序”,我想为它们公开相同的 API,以便我可以互换使用它们。

更新

我认为我的测试太复杂了,因为我想看看是否已经进行了连接调用,然后返回数据,这对我来说很重要,所以我将其剥离并放入两个测试中:

模拟测试

这有效(我认为)因为没有 postgres 连接器代码它失败,它通过了(繁荣 :))

现在的问题是第二种方法,我将使用一个存根(可能是一个间谍),当它应该失败时它会通过 100%,所以我会在早上拿起它。

更新 2

我对测试不是 100% 满意,主要是因为我没有劫持 client.query 方法,它是命中数据库的方法,而只是我的 execute 方法并强制它走上一条路径,但它让我看到了结果并反对它以测试行为,但将对任何建议的改进持开放态度。

我正在使用间谍来捕获该方法并返回 null 和一个包含行的人造对象,就像该方法会传回一样,这个测试会随着我添加更多查询行为而改变,但它让我克服了我的障碍。

0 投票
1 回答
278 浏览

javascript - 使用 XDomainRequest 测试 javascript

处理将数据推送到跨域服务器的 javascript 模块。我在 qunit 中有一个测试套件来验证行为,使用 sinon 拦截请求并伪造来自 XmlHttpRequest 的响应。这很好用,除了 IE8/9 使用 XDomainRequest 来允许 CORS 调用(功能有些受限)。

我的问题是 sinon 允许模拟我对 XmlHttpRequest 的使用,而不是 XDomainRequest。谷歌搜索后,我找不到任何人嘲笑 XDomainRequest。有没有人有围绕 XDomainRequest 进行测试的实际经验以及可以做些什么?

0 投票
4 回答
24563 浏览

unit-testing - 如何使用 Jasmine 和/或 Sinon 正确地对 jQuery 的 .ajax() 承诺进行单元测试?

我有一个相当简单的函数,它返回一个 jQuery .ajax() 承诺,如下所示:

在大多数情况下,这个新的 Promise 接口就像做梦一样工作,并且在使用 jQuery 的 .ajax() 时消除回调金字塔非常棒。但是,我终生无法弄清楚如何使用 Jasmine 和/或 Sinon 正确测试这些 Promise:

  1. 所有 Sinon 的文档都假设您使用的是老式回调;我没有看到一个如何将它与 promises/deferreds 一起使用的示例

  2. 当试图使用 Jasmine 或 Sinon spy 来监视 $.ajax 时,spy 有效地覆盖了 Promise,因此ajax 函数中不再存在其 、 和 子句,因此 Promise 永远不会解决并done抛出fail错误always

我真的很喜欢一两个如何使用上述测试库来测试这些新的 jQuery .ajax() 承诺的例子。我已经相当激烈地搜索了网络,并没有真正挖掘出任何东西。我确实找到的一个资源提到了使用 Jasmine.ajax,但如果可能的话,我想避免这种情况,因为 Sinon 提供了开箱即用的大部分相同功能。

0 投票
1 回答
246 浏览

jquery - 在 IE8 中 JQuery.isFunction 不报告 document.write 是一个函数

我在 IE8 中尝试了 jQuery.isFunction(document.write)并返回false

这是我注意到的几件事。1. document.write.constructor未定义 2. typeof document.write是对象

我在使用 Sinon 在 document.write 上创建存根时知道了这个问题,它抛出了一个异常,说Attempted to wrap object property write as function

虽然,我可以通过绕过对 document.write 的检查来解决这个问题,但我只是想知道它是 JQuery 中的错误还是故意的(尽管看起来不是)。

此外,我检查了 JQuery 代码及其简单检查$.call(a) === "[object Function]"在 IE8(很可能是其他版本)的情况下失败。

还有一件事,为什么我们不能只检查document.write 的调用函数是否已定义和 native?这应该足够了吗?

0 投票
1 回答
382 浏览

jquery - 存根 jQuery.fn 方法在 Chrome 和 Firefox 中运行良好,IE8 失败

我正在使用带有 QUnit 的 sinon 存根编写一系列测试。测试的方法具有自定义插件的依赖关系,我们将调用 Foo,我将其删除:

与手动创建存根相比,我发现使用 sinon 存根非常简单和直观。问题是这在 Chrome 和 Firefox 中运行良好,但在 IE8 中不行。

对于测试结果中的 IE8,我得到:

在测试代​​码中放置一些调试面包屑,看起来 $().Foo 和 $.fn.Foo 都被视为方法,但是在调用 $("#some-selector").Foo() 后测试停止运行, 在 IE8 中运行时。

0 投票
1 回答
148 浏览

javascript - 如何访问此 Javascript 属性?

我需要确保UserMock调用了下面显示的类中的某个方法。我创建了这个模拟版本来注入另一个模块,以防止测试期间的默认行为。

我已经在使用sinon.js,那么如何访问诸如isValid()spy/stub 之类的方法并将其替换?是否可以在不实例化类的情况下做到这一点?

谢谢

0 投票
1 回答
549 浏览

javascript - 在 sinon 中监视咖啡脚本构造函数

我正在尝试验证咖啡脚本构造函数是否引发异常(使用 sinon 和 sinon-chai)。

如何正确创建间谍来验证实例化 Dog 是否引发异常?