我有一个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,但是我很难看到我在这里出错了。
答案 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>');