检查使用Jasmine调用的Backbone视图方法

时间:2014-06-10 09:41:56

标签: backbone.js jasmine

我有一个Backbone应用程序,我正在研究App下所有功能的命名空间。我有一个名为App.LoginView的视图,我想用Jasmine进行测试,但我正努力让它发挥作用。

这是测试的代码:

describe("Test the views", function () {
    'use strict';

    beforeEach(function () {
        // Create DOM element
        $('body').append('<div class="content"></div>');
    });

    afterEach(function () {
        $('div.content').remove();
    });

    // Test the LoginView object was created
    it("tests that the LoginView object exists", function () {
        // Check the view definition exists
        expect(App.LoginView).toBeDefined();

        // Spy on the prototype
        spyOn(App, 'LoginView').andCallThrough();

        // Create the view
        this.LoginView = new App.LoginView();

        // Check the view exists
        expect(this.LoginView).toBeDefined();
        expect(this.LoginView.initialize).toBeDefined();
        expect(this.LoginView.template).toBeDefined();
        expect(this.LoginView.tagName).toBeDefined();
        expect(this.LoginView.render).toBeDefined();

        // Remove it
        this.LoginView.remove();
    });
});

它会抛出以下错误:

TypeError: 'undefined' is not a function (evaluating 'spyOn(App, 'LoginView').andCallThrough()')

我使用grunt-contrib-jasmine运行测试,jasmine-jquery添加对jQuery的支持。我过去曾经使用过Jasmine,但是我很难看到我在这里出错了。

1 个答案:

答案 0 :(得分:1)

最终找到了解决方案。为了让它正常工作,我在原型的initialize方法上进行了间谍,并改变了调用的语法,因为这在Jasmine 2中发生了变化。

spyOn(App.LoginView.prototype, 'initialize').and.callThrough();

我还使用jasmine-jquery动态地将基本模板插入到DOM中,否则Underscore会抱怨丢失的模板:

$('body').append('<script type="text/template" id="login-template"><div class="content-padded"></div></script>');