如何使用Jasmine监视jquery插件中的方法

时间:2011-08-09 07:58:49

标签: jasmine

我有一个定义为这样的插件

(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();
});

我的语法错了吗?

2 个答案:

答案 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

如果我找到解决方案,我会更新。我找不到太多,我认为我不可能抓住我的方法,因为它们被包含在匿名函数调用中,但我们会看到。