使用Jasmine和Sinon运行测试时,FakeServer不返回虚假数据

时间:2014-06-24 20:50:14

标签: javascript testing jasmine sinon

我试图测试一个ko视图模型中的一些observables数组是在ajax请求之后设置的。我使用Jasmine和Sinon。我的问题是,在进行预期测试时,我的土地可观察阵列是空的。在设置sinon fakeserver并返回时我错过了什么?

顺便说一句,这在现场直播时效果很好。

我的ko模型和viewmodel:

var MB = MB || {};

$(function() {
    MB.KontaktModel = function(model) {
        "use strict";

        var self = this;

        self.id = ko.observable(model.Id);
        self.land = ko.observableArray([]);
        self.kategori = ko.observableArray([]);
    };

    MB.KontaktViewModel = function() {
    "use strict";
    var numberCrusher = new MB.NumberCrusher(),
        kontakt = ko.observable(),
        land = ko.observableArray([]),
        kategori = ko.observableArray([]),
        loadKontakt = function(model) {
            var newModel = new MB.KontaktModel(model);
            .......some other setting happens here

            MB.CrmService.GetLand(function (data) {
                ko.mapping.fromJS($.parseJSON(data), {}, land);
                kontakt().land(land());
                MB.UiFixUp.RefreshChosenAfterDataUpdate();
                if (!idIsEmpty) {
                    MB.ChosenAction.SeDefaultValue("chosen-landId", model.LandId);
                }
            });

            MB.CrmService.GetKategori(function (data) {
                ko.mapping.fromJS($.parseJSON(data), {}, kategori);
                newModel.kategori(kategori);
                kontakt().kategori(kategori());
                MB.UiFixUp.RefreshChosenAfterDataUpdate();
                if (!idIsEmpty) {
                    MB.ChosenAction.SeDefaultValue("chosen-kontaktKategori", model.KategoriId);
                }
            });

            kontakt(newModel);
        };

    return {
        kontakt: kontakt,
        loadKontakt: loadKontakt
    };
}();
});

CrmService:

MB.CrmService = function() {
"use strict";

var serviceBaseCrm = '/crm/kontakt/',

    getKategori = function(callback) {
        getSimpleJson("kategori", serviceBaseCrm, callback);
    },

    getLand = function(callback) {
        getSimpleJson("land", serviceBaseCrm, callback);

    };

return {
    GetKategori: getKategori,
    GetLand: getLand
};

}();

这是我的测试:

describe("mb.kontaktViewModel.js", function () {
var server,
    kontaktViewModel,
    testData = {
    land: ['{"Kode": "null", "Id": "e7ae76c0-3598-e311-8270-24fd526b95fb", "Navn": "Chile" },{"Kode": "null", "Id":"d4ae76c0-3598-e311-8270-24fd526b95fb", "Navn":"Mongolia"}'],
    kategori: ['{"Id":"297f66b2-2898-e311-8270-24fd526b95fb", "Navn": "Kunde"},{"Id":"2a7f66b2-2898-e311-8270-24fd526b95fb", "Navn":"Leverandør"}'],
    dummyModel: { Navn: "En kontakt", Nummber: 10005, OrgNr: null, Id : 10001 }
};

beforeEach(function() {
    server = sinon.fakeServer.create();
    kontaktViewModel = MB.KontaktViewModel;
});

afterEach(function() {
    server.restore();
});

describe("when viewmodel's loadKontakt is called", function () {
    it("should populate land with data from server", function () {

        server.respondWith("GET", "/crm/kontakt/land", [200, { "Content-Type": "application/json" }, JSON.stringify(testData.land)]);
        server.respondWith("GET", "/crm/kontakt/kategori", [200, { "Content-Type": "application/json" }, JSON.stringify(testData.kategori)]);
        kontaktViewModel.loadKontakt(testData.dummyModel);
        server.respond();
        expect(kontaktViewModel.kontakt().land()).toBe(JSON.stringify(testData.land));
    });
});

});

1 个答案:

答案 0 :(得分:0)

确保发送的实际网址完全符合:

/crm/kontakt/land
/crm/kontakt/kategori

您可以查看Devtools中的浏览器控制台(例如:在Chrome中),看看您是否正确捕捉它。如果您的URL中有其他字符串,则始终可以与RegEx匹配。例如,如果要检查URL是否以您指定的字符串开头,可以使用:

server.respondWith("GET", /^\/crm\/kontakt\/kategori/, [200, { "Content-Type": "application/json" }, JSON.stringify(testData.kategori)]);    

否则,继续使用相同的devtools并放置断点,看看你收到的JSON是什么。 最后,我通常希望在server.autoRespond = true上将服务器设置为beforeEach,这样您就不必在每个测试中使用server.respond。