在以下单元测试代码中:
TestModel = Backbone.Model.extend({
    defaults: {
        'selection': null
    },initialize: function() {
      this.on('change:selection',this.doSomething);
    },doSomething: function() {
        console.log("Something has been done.");
    }
});

module("Test",{
    setup: function() {
        this.testModel = new TestModel();
    }
});

test("intra-model event bindings",function() {
    this.spy(this.testModel,'doSomething');
    ok(!this.testModel.doSomething.called);
    this.testModel.doSomething();
    ok(this.testModel.doSomething.calledOnce);
    this.testModel.set('selection','something new');
    ok(this.testModel.doSomething.calledTwice); //this test should past,but fails.  Console shows two "Something has been done" logs.
});

第三个ok失败,即使该函数是从主干事件绑定中有效调用的,如控制台演示的那样.

这非常令人沮丧,并且让我对sinon.js是否适合测试我的骨干应用程序感到震惊.我做错了什么,或者这是一个问题,sinon如何检测是否已经调用了某些东西?有解决方法吗?

编辑:这是我的具体例子的解决方案,基于接受答案的猴子补丁方法.虽然它在测试中有几行额外的设置代码,(我不再需要模块功能)但它完成了工作.谢谢,亩太短了

test("intra-model event bindings",function() {
    var that = this;
    var init = TestModel.prototype.initialize;
    TestModel.prototype.initialize = function() {
        that.spy(this,'doSomething');
        init.call(this);
    };

    this.testModel = new TestModel();
    . . . // tests pass!
});

解决方法

调用this.spy(this.testModel,’doSomething’)用 new wrapper method替换testModel.doSomething方法:

var spy = sinon.spy(object,“method”);

Creates a spy for object.method and replaces the original method with the spy.

所以this.spy(this.testModel,’doSomething’)实际上是这样做的:

var m = this.testModel.doSomething;
this.testModel.doSomething = function() {
    // Spying stuff goes here...
    return m.apply(this,arguments);
};

这意味着在initialize中绑定事件处理程序时,testModel.doSomething是一个不同的函数:

this.bind('change:selection',this.doSomething);

在你附上间谍之后. Backbone事件调度程序将调用原始的doSomething方法,但该方法没有Sinon检测.当您手动调用doSomething时,您将调用间谍添加的新函数,并且该函数具有Sinon检测.

如果你想使用Sinon测试你的Backbone事件,那么你必须安排在绑定任何事件处理程序之前将Sinon间谍调用应用于模型,这可能意味着挂钩初始化.

也许你可以修补模型的初始化,以便在绑定任何事件处理程序之前添加必要的间谍调用:

var init = Model.prototype.initialize;
Model.prototype.initialize = function() {
    // Set up the Spy stuff...
    init.apply(this,arguments);
};

演示:http://jsfiddle.net/ambiguous/C4fnX/1/

您还可以尝试使用以下内容对您的模型进行子类化:

var Model = Backbone.Model.extend({});
var TestModel = Model.extend({
    initialize: function() {
        // Set up the Spy stuff...
        Model.prototype.initialize.apply(this,arguments);
    }
});

然后使用TestModel而不是Model,这将在TestModel中为您提供一个检测版本的Model,而不必在正常的生产就绪模型中包含一堆特定于测试的代码.缺点是使用Model的任何其他东西都需要进行子类化/修补/ …以使用TestModel.

演示:http://jsfiddle.net/ambiguous/yH3FE/1/

您可以通过以下方式解决TestModel问题:

var OriginalModel = Model;
Model = Model.extend({
    initialize: function() {
        // Set up the Spy stuff...
        OriginalModel.prototype.initialize.apply(this,arguments);
    }
});

但你必须得到正确的订购,以确保每个人都使用新模型而不是旧模型.

演示:http://jsfiddle.net/ambiguous/u3vgF/1/

javascript – QUnit,Sinon.js和Backbone单元测试挫折:sinon间谍似乎未能检测到Backbone Model事件回调的更多相关文章

  1. 如何通过代码设置iOS的系统时区?

    我想通过代码在iOS中设置系统时区,日期时间.任何想法或私人api帮助我?示例:将时区设置为GMT8,将日期时间设置为2013年8月10日晚上8:30.怎么做?

  2. ios – 如何为NSNotification编写单元测试

    我在swift工作,我想刷新一个页面,所以我使用通知发送它,我在一个ViewController中发布通知并在另一个中添加观察者,它工作正常.我想要做的是在swift中添加单元测试.我查了很多网站但是没能做到.我是新手,不知道从哪里开始.基本上工作是,当我点击按钮通知被发布时,并且当加载下一个视图控制器时,添加通知观察者.我该怎么做单元测试提前致谢编辑:码并添加观察者解决方法一般的解决方案是:使用

  3. 如何在iOS中为预期的assert / assertionFailure编写单元测试?

    这里的问题是,当someString参数为空字符串时,您可以保证函数不会失败–在您的实际应用程序中.这是因为断言不在发布版本中运行.结果是你可以在开发过程中使用assert作为调试的一种形式,但如果这种情况在现实生活中发生,你应该按顺序处理它,而不是崩溃.因此测试断言“发生”是否真的不是一种有效的单元测试技术,这就是为什么你以这种方式使用它的麻烦.

  4. xcode – 如何在不影响单元测试目标构建的情况下更改发布目标的名称?

    我有一个发布目标和一个测试目标,我想更改发布目标的名称,但如果我这样做,我开始在测试目标中获得链接错误.由于它们是单元测试,我认为在测试目标中不会/应该是对发布目标的依赖,但显然存在.链接错误是:在重命名之前,XYZ.app是发布目标的名称.是否有自动或快速更新单元测试目标的方法,以便它保持步调状态?

  5. ios – 可以测试IBAction吗?

    对IBOutlets进行单元测试有点容易,但IBActions呢?我试图找到一种方法,但没有任何运气.有没有办法在ViewController中的IBAction和nib文件中的按钮之间进行单元测试连接?解决方法对于完整的单元测试,每个插座/操作需要三个测试:>插座是否连接到视野?

  6. ios app如何“知道”运行单元测试

    我知道我可以用xcodebuild开始我的应用程序的单元测试,但我想知道是什么告诉应用程序在启动期间运行测试,它是一个发送到应用程序的特殊参数,还是以不同的方式编译以运行测试?

  7. ios – Xcode 6.1直到运行时才检测到单元测试

    我遇到了Xcode6.1.1没有检测到单元测试文件的问题.我运行了与之关联的方案,并在运行时找到了该文件,最后在单元测试导航器中找到了一个“rT”图标.这导致我到thisquestion,但没有一个答案对我有用.删除我的派生数据或重新启动Xcode没有任何帮助.接近工作的唯一事情是在Xcode运行时删除我的派生数据文件夹–当它重新编制索引时,它发现了我的三个方案中的一个中的所有测试文件.所有这些测

  8. xcode – 在仪器中运行SenTestingKit单元测试

    我正在开发一个数据库访问库,我试图使用已经写的单元测试检查内存泄漏.这些是基于SenTestingKit的逻辑测试,在Xcode4.2中设置了正常的方式.我可以使用Cmd-U运行它们,但是没有看到从仪器启动它们的方法,或者调用仪器来检查它们.我该怎么做这个工作?我需要编写新的案例并将其构建到应用程序中吗?

  9. Xcode:用于条件DEBUG / TEST代码的预处理器宏

    我在我的代码(例如AppDelegate.m)中有不应该为单元测试编译的部分,例如当您在创建新项目时选择“添加单元测试”时,目标是由Xcode设置的.在项目文件中,我已将标志CONfigURATION_TESTS添加到内置目标的MyAppTests的预处理器宏中,但未添加到MyApp目标.这是我发现的许多帖子中的建议方式.但是这不起作用,因为(我猜)MyAppTests目标将MyApp目标作为依赖

  10. xcode – 如何将Compile Sources中的文件从一个目标复制并粘贴到另一个目标?

    我有一个主要目标,其目标下包含某些文件–>构建阶段–>编译源我开始单元测试,并希望单元测试包含与主要目标相同的文件.有没有办法将包含在一个目标中的文件复制粘贴到另一个目标?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部