我有一个定义为这样的插件
(function($){
$.fn.robodisco = function(callerSettings) {
var findVideos = function(params){ ... }
$(".track").click(function(){
....
findVideos(data) });
....
在我的测试中,我想监视findVideos
并检查它是否被调用。然而,Jasmine一直在抱怨它无法找到方法。这是我的规范:
it("searches for videos for track", function(){
spyOn($.fn.robodisco, "findVideos");
$lastTrack.click();
expect($.fn.robodisco.findVideos).toHaveBeenCalled();
});
我的语法错了吗?
答案 0 :(得分:2)
我知道这是一篇较老的帖子,但我想我会回答,因为我找到了一个解决方案,帮助我今天解决了同样的问题。我有一个jasmine单元测试,确保dcjqaccordion插件在包含accordion插件的AngularJS Provider内部使用一组默认值进行初始化。我做的是我用一个间谍来嘲笑我传递给插件的元素,该间谍存储了预期插件调用的功能。
测试代码:
var mockElement = jasmine.createSpyObj('mockElement', ['dcAccordion']);
it('should initialize with prescribed defaults', function(){
var expectedDefaults = {
eventType: 'click',
autoClose: false,
saveState: true,
disableLink: true,
speed: 'slow',
showCount: false,
autoExpand: true,
classExpand: 'dcjq-current-parent'
};
testDcjqaccordionProvider.initialize(mockElement);
expect(mockElement.dcAccordion).toHaveBeenCalledWith(expectedDefaults);
});
生产代码:
app.provider('dcjqaccordionWrapper', function(){
//Lazy load our dependency on the plugin
function getAccordionPlugin(){
$.getScript('scripts/jquery.dcjqaccordion.2.7.js')
.done(function(){
console.log("Successfully loaded the dcjqaccordion plugin.");
})
.fail(function(){
console.log("There was a problem loading the dcjqaccordion plugin.");
});
}
var defaults = {
eventType: 'click',
autoClose: false,
saveState: true,
disableLink: true,
speed: 'slow',
showCount: false,
autoExpand: true,
classExpand: 'dcjq-current-parent'
};
this.initialize = function(inElement){
inElement.dcAccordion(defaults);
};
this.$get = function(){
getAccordionPlugin();
return this;
};
})
答案 1 :(得分:1)
问题在于,您正在寻找findVideos
作为robodisco
方法的属性,而不是robodisco.findVideos
方法的属性。它是该方法中的局部变量,因此尝试通过{{1}}访问它是行不通的。
由于我遇到了类似的问题,我正在研究如何解决这个问题。我试图窥探的方法是在我的jQuery插件的命名空间之外定义的plugin authoring docs。
如果我找到解决方案,我会更新。我找不到太多,我认为我不可能抓住我的方法,因为它们被包含在匿名函数调用中,但我们会看到。