我正在使用骨干和茉莉花 当模型保存时,尝试测试callCount的'sync'方法。 出于某种奇怪的原因,即使在done变量为真之后,同步处理程序仍继续处理同步(这是我计划停止测试) 我是茉莉花的新手所以我想我不明白这里的元素......
这是我的特色:
describe('Model :: User', function() {
var mockData = { name: 'Foo Bar' };
beforeEach(function() {
var that = this,
done = false;
require(['app/namespace','app/models/UserModel','app/collections/UsersCollection'], function(namespace, UserModel ,UsersCollection) {
that.users = new UsersCollection();
that.user = new UserModel();
done = true;
});
waitsFor(function() {
return done;
}, "Create Models");
});
afterEach(function(){
var done = false,
isDone = function(){ return done; };
this.users.fetch({
success: function(c) {
console.log('after the test calling destory of collection...')
c.each(function(m){
m.destroy();
});
done = true;
}
});
waitsFor(isDone);
done = false;
this.user.destroy({
success: function(){
console.log('after the test calling destory of model...')
done = true;
}
});
waitsFor(isDone);
});
describe('.save()', function() {
it('should call sync when saving', function() {
var done = false,
spy = jasmine.createSpy();
this.user.on('sync', spy);
this.user.on('sync', function(){
console.log('checking spy.callCount-'+spy.callCount);
//------------------------------------------------
if(!done)//why i need this if ?!
expect(spy.callCount).toEqual(1);
done = true;
}, this);
this.user.save(mockData);
waitsFor(function() { return done; });
});
});
});
只有在expect语句之前添加“if(!done)”条件时,测试工作才正确, 否则它继续计算测试后由破坏引起的同步调用... 谢谢你的转发
答案 0 :(得分:1)
此测试存在一些问题。首先,您不需要在保存模型时测试sync
事件被触发,因为这是由另一个框架提供的,希望对此进行测试。
其次,您应该使用fake server的SinonJs来解决异步调用问题。使用sinon,您的请求将立即被调用,这意味着您不需要waitsFor
。回调中的断言似乎有点奇怪。
this.server = sinon.fakeServer.create();
server.respondWith({data: 'someData'})
server.autoRespond = true; //so when the request start the fake server will immediately call the success callback
var spy = jasmine.createSpy();
this.user.on('sync', spy);
this.user.save(mockData);
expect(spy.callCount).toEqual(1);