我试图测试一个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));
});
});
});
答案 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。