【发布时间】:2013-07-26 11:31:48
【问题描述】:
我在 Jasmine 中进行间谍活动时遇到了一些麻烦
我想使用 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 评论的那样)。你试过这个吗?