使用Firebase和angularFire对应用进行单元测试。使用mockfirebase模拟Firebase。
在此测试中,承诺在测试完成后得到解决:
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 async done功能:
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(),没有任何更改。
我如何立即解除承诺,以便测试可以通过?
答案 0 :(得分:0)
这解决了它:
$timeout.flush();
更新了测试:
it('should resolve to a obj', function() {
var obj = objService.getObjFromRefString('1234/q1w2');
obj.$loaded().then(promiseResolved);
obj.$ref().flush();
$timeout.flush();
expect(promiseResolved).toHaveBeenCalled(); // great success
});