Promise 在单元测试中解决得太晚
Promise resolves too late in unit test
使用 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()。
我怎样才能让 promise 立即 resolve 以便测试可以通过?
这解决了它:
$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
});
使用 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()。
我怎样才能让 promise 立即 resolve 以便测试可以通过?
这解决了它:
$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
});