Jasmine间谍未被调用

10

我在实现Jasmine中的间谍(spy)时遇到了些麻烦。

我想要使用Jasmine Spy和Jasmine jQuery来检查是否单击了幻灯片上的链接。

这是一个简化版本:

我在HTML装置文件中有一些链接。

<a href="#" class="someLink">Link 1</a>
<a href="#" class="someLink">Link 2</a>

滑块:

var Slider = function(links){
    this.sliderLinks = $(links);
    this.bindEvents();
}

Slider.prototype.bindEvents = function(){
    this.sliderLinks.on('click', this.handleClick);
}

Slider.prototype.handleClick = function(e){
    console.log('i have been clicked')
}

规范文件:

describe('Slider', function(){
    var slider;

    beforeEach(function(){
        loadFixtures('slider.html');

        slider = new Slider('.someLink');

    });

    it('should handle link click', function(){
        spyOn(slider, 'handleClick');
        $(slider.sliderLinks[0]).trigger('click');
        expect(slider.handleClick).toHaveBeenCalled();
    });

});

测试失败了。但是“我已经被点击”已经被记录到控制台中,所以该方法已经被调用。

如果我这样做,测试就能通过:

it('should handle link click', function(){
        spyon(slider, 'handleClick');
        slider.handleClick();
        expect(slider.handleClick).toHaveBeenCalled();
    });

所以我的问题实际上是:

  1. 我是否用错误的方式测试了这种情况?
  2. 为什么间谍没有注册方法已被调用的事实?

1
我猜在这种情况下你应该监视原型spyOn(Slider.prototype, 'handleClick'),并将此代码放置在Slider创建new Slider(...)之前(如@EliranMalka所评论的)。你试过这个吗? - zbynour
1个回答

25

我刚刚验证了评论中概述的解决方案。你的describe应该是:

describe('Slider', function () {

    var slider;

    beforeEach(function () {
        loadFixtures('slider.html');
        spyOn(Slider.prototype, 'handleClick');
        slider = new Slider('.someLink');
    });

    it('should handle link click', function (){
        $(slider.sliderLinks[0]).trigger('click');
        expect(slider.handleClick).toHaveBeenCalled();
    });

});

重点是你需要在 Slider 创建之前对原型中的 handleClick 函数进行监听。

原因是在你提供的代码中,Jasmine 的 spyOn 实际上是这样做的:

spyOn(slider, 'handleClick');

直接在slider实例上创建一个包含间谍对象的滑块属性handleClick。在这种情况下,slider.hasOwnProperty('handleClick')返回true,你知道...

但是,仍然有handleClick原型属性,您的点击事件绑定到该属性。这意味着刚触发的点击事件由原型handleClick函数处理,而滑块对象拥有自己的属性handleClick(即您的间谍)保持不变。

因此,答案是间谍并未注册方法已被调用的事实,因为它从未被调用过 :-)


你对原型和自有属性的解释非常准确,而且在文档中没有提到。非常感谢! - dbrin
@dbrin 很高兴能帮助到您 =) - zbynour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接