使用jasmine测试Backbone视图时,未定义stView.el

时间:2017-08-06 20:02:48

标签: unit-testing backbone.js jasmine requirejs jasmine-jquery

我正在使用Jasmine进行单元测试以使用Backbone.js测试应用程序(这是我第一次使用它们,所以我有点卡住了:/) 这是我的Backbone视图

define(['jquery','backbone','underscore','handelbars','models/story','text!templates/story.html',
		'controllers/storyController'], 
function($, Backbone, _,handelbars, story,storyTemplate,ctrl){
	var View = Backbone.View.extend({
		el: '#main',
		events:{
			'click .close-story' : 'closeStory',
		}
        // Some functions
	});
	return View;
});

和Jasmine的规格

define(['views/storyView'],function (storyView) {
  describe("Testing the Story View ",function () {
    var stView;
    beforeEach(function(){
      stView=new storyView({id:1});
      stView.render();
    })
    it("Test if el is defined and trigger the click ",function () {
      expect(stView.el).toBeDefined(); 
    })
  })
})

谢谢:)

1 个答案:

答案 0 :(得分:0)

视图构造函数中有硬编码el: '#main'。 这将评估加载AMD模块的时间。 当你运行jasmine单元测试时,我不认为你的应用程序的这个元素在Jasmine测试页面中是可用的,除非你以某种方式嘲笑它。您可以通过在构造函数上设置断点并检查DOM来测试它。

要使现有代码起作用,您应该在加载包含视图定义的模块之前,在运行测试的DOM jasmine上附加一个虚拟元素。

另一方面,最好删除硬编码的el: '#main'(你可以告诉开发人员这是一个非常糟糕的编码实践)并在创建视图实例时传递元素引用,所以你可以做到

new storyView({id:1, el : $('<div/>'}); // dummy element for test