Тестирование сохранения модели Backbone.js с использованием Sinon, не вызывающего обратный вызов успеха

Я тестирую приложение Backbone.js, используя Jasmine и Sinon. Я пытаюсь проверить, что нажатие кнопки вызывает метод save() модели и обрабатывает обратный вызов успеха, который добавляет сообщение в элемент el представления. У меня возникли проблемы с тем, чтобы сервер sinon запускал обратный вызов модели.

Вот как выглядит моя спецификация beforeEach (все переменные в beforeEach имеют переменную область действия в функции описания).

beforeEach(function(){
    server = sinon.fakeServer.create(); //create the fake server
    server.respondWith([200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"]); //fake a 200 response

    loadFixtures('signup_modal.html'); //load the fixture

    element = $("#signupModal");
    specSignUp = new SignUp();
    signUpView = new SignUpView({model : specSignUp, el: $("#signupModal")});
});

А вот как выглядит реальный тест:

it("Should call send request",function(){

    element.find("#signupButton").trigger('click'); //click the button which should trigger save

    server.respond(); //fake the response which should trigger the callback

    expect(element).toContain("#message");
});

Пытаясь создать реализацию этого, я создал простой метод обратного вызова, чтобы показать мне, что обратный вызов успеха запускается:

sendRequest: function(){
    console.log("saving");
    this.model.save(this.model.toJSON(),{success: function(data){
        console.log("success");
        iris.addMessage(this.$("#messageContainer"),"Thank you");
    }});
}

Когда я запускаю тест, консоль показывает «сохранение», но обратный вызов успеха не вызывается.


person bittersweetryan    schedule 25.02.2012    source источник
comment
Вызывается ли обратный вызов ошибки?   -  person abraham    schedule 25.02.2012
comment
Ах ха! Ошибка вызывается! Я никогда не думал искать это.   -  person bittersweetryan    schedule 25.02.2012


Ответы (1)


Backbone ожидает, что текст ответа будет действительным JSON, и произошел сбой из-за ответа «ОК» в методе server.respondWith().

Изменение метода на:

server.respondWith([200, {"Content-Type":"text/html","Content-Length":2}, '{"OK":"True"}']);

Обратный вызов успешно обработан.

person bittersweetryan    schedule 25.02.2012
comment
Это не было пустой тратой времени, комментарий @abraham направил меня на правильный путь. Без этого я не думаю, что получил бы результат так быстро. Но да, это всегда мелочи, которые получают тебя! - person bittersweetryan; 25.02.2012