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

Javascript FakeServer在使用Jasmine和Sinon运行测试时不返回假数据,javascript,testing,jasmine,sinon,Javascript,Testing,Jasmine,Sinon,我试图测试koviewmodel中的一些可观察数组是在ajax请求之后设置的。我用的是茉莉花和西农。我的问题是,在执行预期测试时,我的land observablearray是空的。在设置sinon fakeserver并返回时,我错过了什么 顺便说一句,这在运行live时效果很好 My ko模型和viewmodel: var MB = MB || {}; $(function() { MB.KontaktModel = function(model) { "use s

我试图测试koviewmodel中的一些可观察数组是在ajax请求之后设置的。我用的是茉莉花和西农。我的问题是,在执行预期测试时,我的land observablearray是空的。在设置sinon fakeserver并返回时,我错过了什么

顺便说一句,这在运行live时效果很好

My 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
    };
}();
});
CRM服务:

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));
    });
});

}))

确保实际发送的URL准确无误:

/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)]);    
否则,在相同的devtool中继续并放置断点,然后查看返回的JSON。 最后,我通常喜欢在每次测试之前在我的
上将服务器设置为
server.autoRespond=true
,这样您就不必在每次测试中使用server.respond