【发布时间】:2013-08-11 17:12:43
【问题描述】:
首先,这是一项工作要求。如果不能以这种方式完成,我需要一个很好的论据。
我必须使用 jasmine 和 sinon 测试我们的骨干项目。我不知道如何在函数中模拟 jquery 调用。我有一个这样的函数(清理了一点以丢弃无关的调用):
Project.Views.FormView = Backbone.View.extend({
sidenavClicked: function(event){
var sidenav_id = $(event.target).attr('id').split('m')[1];
var sidenav_num = sidenav_id.split('m')[1];
var form_id = $('div.active form').attr('id');
var form_num = form_id.split('m')[1];
//code for fast scrolling
this.slideTo(form_num-1, sidenav_num-1);
return false;
},
...
});
现在我只是想测试一下 slideTo() 是否被调用这是我的茉莉花规格
describe("Form", function(){
describe("Carousel", function(){
it("should call slideTo when navbar is clicked", function(){
var spy = sinon.spy();
var formView = new Project.Views.FormView({ el : $('#main'), id : 1});
formView.bind('slideTo', spy);
var event = {};
event.target = "<div id='form1'></div>";
formView.sidenavClicked(event);
});
});
错误信息是:TypeError: form_id is undefined in file: .../src/main/webapp/js/views/FormView.js
据我所知,这是因为没有可供 jQuery 匹配的文档。如何让 form_id 有值?
实际的代码确实有效,并且确实做了它应该做的事情。
更新:html 看起来像这样:
<html>
<body>
<div id="main">
<ul id="carousel-navbar">
<li><a id="navlink-form1">Text</a></li>
...
</ul>
<div id="formCarousel" class=" carousel slide" >
<div class="active first item">
<form id="form1" name="question1">
...
</form>
</div>
...
</div>
</div>
</body>
</html>
澄清不完全是这样(实际是 442 行),但结构应该是相关的同义词。
【问题讨论】:
-
在里面。我会更新答案。
-
如果它在
el内,那么你应该使用this.$()而不是$(),这甚至可以解决你的问题(但我对你的堆栈了解不够肯定知道)。 -
是的,我已经尝试过了。$()。问题是 jasmine 测试没有附加到我知道的任何 html 上,因此 jQuery 选择器没有选择任何内容。如果这不正确,请告诉我。
-
服务器上运行的代码运行正常。
-
你能把上面显示的 html 传递给 FormView 构造函数吗?只要您随后使用 this.$(),它就应该对您的模拟 HTML 起作用。
标签: jquery backbone.js jasmine sinon