如何使用jasmine测试包含jquery的骨干代码?

时间:2012-06-06 22:20:28

标签: jquery backbone.js jasmine

我的骨干视图的一个初始化函数包含以下代码:

$.when(this.broadcasters.fetch(), 
       this.model.fetch(), this.call_types.fetch()).done(
          function(){
              do_important_stuff
          });

提取的结果与测试无关,但块内的代码对测试很重要。

我最初的想法是使用jasmine-ajax,但这仅支持响应最近的请求,我们实际上有3个不同的AJAX请求来响应。

我无法真正模仿它们,因为我没有一个可以模拟的对象(因为这是一个初始化函数)。

最后,我最终只是手动运行“do_important_stuff”,这似乎并不理想,因为它会将代码复制到测试中。

修改

根据请求,如何创建视图实例:

var responder = new EmailResponder({model: email, el: some_element, reply: true});

1 个答案:

答案 0 :(得分:1)

您应该尝试使用sinon.js。它是用于存根和嘲弄的很棒的库,包括mocking XHR。 看看例子:

var Model = Backbone.Model.extend({});
var Collection = Backbone.Collection.extend({
    model: Model,
    url: "/api/models"
});

var server = sinon.fakeServer.create();
server.respondWith("/api/broadcasters", [
    200,
    {"Content-Type": "application/json"},
    JSON.stringify({"data": "foo"})
]);

server.respondWith("/api/models", [
    200,
    {"Content-Type": "application/json"},
    JSON.stringify({"data": "bar"})
]);

server.respondWith("/api/call_types", [
    200,
   {"Content-Type": "application/json"},
    JSON.stringify({"data": "baz"})
]);

$.when($.get('/api/broadcasters'), $.get('/api/call_types'), collection.fetch()).then(function() {
    console.log('here it is!');
});

server.respond();

http://jsfiddle.net/theotheo/DxVkr/