使用ajax返回值的Jasmine调用函数

时间:2013-07-26 20:29:52

标签: ajax jasmine

我想使用Jasmine测试“addGroup”函数。我收到以下错误:

错误:预期间谍modifyMyHtml被调用.at null。

我不知道测试addGroup函数的最佳方法是什么。请帮助.....

var myRecord = {

   addGroup: function(groupNumber) {

        $.when(myRecord.getHtml())
        .done(function(returnedHtml){
            myRecord.modifyMyHtml(returnedHtml);           
        });
    },

    getHtml: function() {
        return $.ajax({url: "myHtmlFile.html", dataType: "html" });
    },
    // adds options and events to my returned HTML
    modifyMyHtml: function(returnedHtml) {
        $('#outerDiv').html(returnedHtml);
        var myOptions = myRecord.getOptions();
        $('#optionsField').append(myOptions);
        myRecord.bindEventsToDiv();
    },
}

==== JASMINE TEST

describe("Configure Record page", function() {
    var fixture;

    jasmine.getFixtures().fixturesPath = "/test/" ;
    jasmine.getFixtures().load("myHtmlFile.html");
    fixture = $("#jasmine-fixtures").html();

    describe("addGroup", function(){
        beforeEach(function() {
            var groupNumber = 0;
            spyOn(myRecord, "getHtml").andCallFake(function(){
                return $.Deferred().promise();
            });
            spyOn(myRecord, "modifyMyHtml");
            myRecord.addGroup(groupNumber);
        });

        it("Should call getHtml", function() {
            expect(myRecord.getHtml).toHaveBeenCalled();
        });

        it("Should call modifyMyHtml", function() {             
            expect(myRecord.modifyMyHtml).toHaveBeenCalled();  ==>FAILS
        });         
    }); 
});

1 个答案:

答案 0 :(得分:1)

您需要在andCallFake中退回之前解决承诺。

spyOn(myRecord, "getHtml").andCallFake(function(){
  return $.Deferred().resolve ().promise();
});

顺便说一下。你不应该测试你要测试的对象上的函数被调用,但是DOM中的html是用正确的html设置的

it("Should call modifyMyHtml", function() {    
   spyOn(myRecord, "getHtml").andCallFake(function(){
      return $.Deferred().resolveWith(null, 'returnedHtml').promise();
   });         
   expect($('#outerDiv').html).toEqual('returnedHtml')
});