我在实现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();
});
所以我的问题实际上是:
- 我是否用错误的方式测试了这种情况?
- 为什么间谍没有注册方法已被调用的事实?
spyOn(Slider.prototype, 'handleClick')
,并将此代码放置在Slider
创建new Slider(...)
之前(如@EliranMalka所评论的)。你试过这个吗? - zbynour