【问题标题】:Jasmine testing: how to spy on special function?Jasmine 测试:如何窥探特殊功能?
【发布时间】:2015-04-20 08:37:14
【问题描述】:

我是测试、Jasmine 和 Javascript 的新手,也许这个问题是微不足道的。我必须用 Jasmine 测试一个函数:

define(["module", ...], function(Module, ...){
    //...
    action: function(){
        //...
        Backbone.history.navigate('companies', {trigger: true});
        //...
    }
}

测试看起来像这样:

describe("function action", function() {
    it ("calls Backbone.history.navigate()", function(){
        spyOn(module, "Backbone.history.navigate");
        module.action();
        expect(Backbone.history.navigate()).toHaveBeenCalled();
    });
});

但这不起作用。它说:

Error: Backbone.history.navigate() method does not exist

我必须做什么才能监视该方法? 我已经尝试在运行该函数之前加载backbone.js 文件,但这并没有改变任何东西。

【问题讨论】:

    标签: javascript testing backbone.js jasmine spy


    【解决方案1】:

    你可以写

    spyOn( Backbone.history, 'navigate' );
    

    然后

    expect( Backbone.history.navigate ).toHaveBeenCalled();
    

    一个可能的缺点是,如果您曾经并行执行测试并且Backbone.history.navigate 被一个测试监视并被另一个测试使用,那么您可能不会得到预期的结果。

    【讨论】:

    • 您可以告诉间谍使用.andCallThrough().and.callThrough() 调用原始函数,具体取决于使用的茉莉花版本。
    • 这适用于 Backbone。但是我对自定义模块 Session 进行了同样的尝试,但出现了错误:Session is not defined。那里有什么问题?会话在模块中使用,就像 Backbone 一样......
    • 如果显示Session is not defined,仅表示在作用域内执行时不可用。
    • 我尝试使用 and.callThrough() 这是一个非常好的解决方案。但是如果我想通过一个我不监视的函数来调用我该怎么办。这意味着在函数 action() 中创建了一个新对象,并调用了该对象中的一个函数,这会导致错误。我能做些什么来阻止这个函数被执行?
    • 其实我对你的场景不太了解。但是,如果我可以提出一些建议,我会说,您应该监视您从任何方法调用的所有方法(在本例中来自 action)并检查该方法是否不是从 action 调用的 - 因为这就是 @987654329 @方法的职责是。然后,无论被调用方法做什么,都应该单独检查到被调用方法的单元测试中。
    【解决方案2】:

    你应该尝试关注

    var backbone_historySpy=spyOn(Backbone,'history.navigate');
    describe('testing function action:',function(){
    it('expect Backbone.history.navigate() to be called',function(){
    module.action();
    expect(backbone_historySpy).toHaveBeenCalled();
    });
    });
    

    它应该可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 2021-01-18
      • 2020-02-24
      • 2015-08-22
      • 2010-10-28
      • 2018-01-31
      • 1970-01-01
      相关资源
      最近更新 更多