【发布时间】:2016-01-10 23:03:58
【问题描述】:
使用 Firebase 和 angularFire 对应用进行单元测试。使用 mockfirebase 模拟 Firebase。
在这个测试中,promise 在测试完成后被解析:
describe('the service api', function() {
var promiseResolved;
beforeEach(function() {
// Inject with expected values
_setup();
promiseResolved = jasmine.createSpy('promiseResolved');
});
it('should resolve to a obj', function() {
var obj = objService.getObjFromRefString('1234/q1w2');
obj.$loaded().then(promiseResolved);
obj.$ref().flush();
expect(promiseResolved).toHaveBeenCalled(); // fails
});
});
这种方法似乎适用于the angularFire tests - 请参见第 125 行。
如果我使用 Jasmine 异步完成功能:
it('should resolve to a obj', function(done) {
var obj = objService.getObjFromRefString('1234/q1w2');
obj.$ref().flush();
obj.$loaded().then(function() {
console.log('resolved');
promiseResolved();
expect(promiseResolved).toHaveBeenCalled();
done();
});
});
失败并显示消息“错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调”。 console.log 显示在前面。
承诺似乎在超时后就解决了。我尝试调用 $rootScope.$apply() 而不做任何更改。
我怎样才能让承诺立即解决,以便测试通过?
【问题讨论】:
-
$flush() 不应该放在最后吗?无论如何,您也必须添加 $rootScope.$apply()。
-
你检查过承诺是否真的成功解决了吗?如果被错误拒绝,
done将不会被调用。 -
@lex82 Firebase 操作在创建 obj 时排队。之后应该调用 ref.flush() 。不会更改任何内容以将其移至末尾。
-
@boyomarinov 是的,日志已完成,我检查了 promise.$$state.status 在调试器中为 1。它成功解决,但在超时之后。
标签: angularjs jasmine firebase angularfire