我正在使用 Jasmine 2.8 和 jasmine-ajax 插件来模拟 jQuery getJSON 调用。回调应该将数据存储回对象中。我有一个类结构如下。
// --------- settings.js ------------
class settings{
load(filename, callback){
let self = this;
$.getJSON(filename,funciton(d){
let err = false;
self._d = d;
callback(d, err);
}).fail(function(jqxhr, stat, err){
let msg = ... build error message ...
callback(msg, true);
});
}
}
// ------- myModule.js --------------
var Settings = require('settings');
class myModule{
constructor(settingsFile){
this._d = {};
this._file = settingsFile;
this._settings = new Settings();
}
load(callback){
let self = this;
this._settings.load(this._file, function(d,err){
if(!err){
self._d = d;
console.log(self._d); // prints the object
callback('success');
}
});
}
}
// ---------- myModuleSpec.js -------------
describe('manipulating data data', function(){
beforeEach(function(){
this.d = { pro1:'property1', prop2:{ foo:'bar' }};
jasmine.Ajax.install();
this.my = new MyModule('myfile.json');
this.cb = new jasmine.createSpy();
this.my.load(this.cb);
let r = jasmine.Ajax.requests.mostRecent();
r.respondWith({
status:200,
responseText.JSON.stringify(this.d);
});
});
afterEach(function(){
this.my = undefined;
jasmine.Ajax.uninstall();
});
it('should have called the callback',function(){
expect(this.cb).toHaveBeenCalled(); //passes
});
it('should contain the data', function(){
console.log(this.my._d); // prints { } to the console
expect(this.my._d).toEqual(jasmine.objectContaining(this.d)); // FAIL
});
});
Jasmine 返回错误消息: Expected({ }) to equal 。
将打印语句放入代码中会验证回调是否已被调用和接收,但是当测试运行时,数据属性 (_d) 是一个空对象。
我在 nodejs 的命令行上使用 jasmine。我有一个助手,它使用 JSDOM 加载虚拟 dom 并配置 global.getJasmineRequireObj 来配置 jaxmine-ajax;
谢谢你。