Angularjs 因果报应角度单位测试承诺永远无法解决
我试图确保我的单元测试用例涵盖了承诺永远无法解决的场景,并且我遇到了一些问题 一个代码块抵得上千言万语,所以Angularjs 因果报应角度单位测试承诺永远无法解决,angularjs,unit-testing,promise,q,resolve,Angularjs,Unit Testing,Promise,Q,Resolve,我试图确保我的单元测试用例涵盖了承诺永远无法解决的场景,并且我遇到了一些问题 一个代码块抵得上千言万语,所以 it('returns my resource', function() { var myUser = {name:'Bob'} $httpBackend.expectGET('/myresource').respond(200,myUser); myService.getMyUser() .then(function(data) { ex
it('returns my resource', function() {
var myUser = {name:'Bob'}
$httpBackend.expectGET('/myresource').respond(200,myUser);
myService.getMyUser()
.then(function(data) {
expect(data).toEqual(myUser);
},fail);
});
这一切都很好,测试结果表明响应符合预期,如果承诺被拒绝,测试也会失败
然而,如果这个承诺永远无法实现,那么测试就通过了,我希望它失败。我正在myService中缓存此请求,如下所示:
var cachedUser;
function getMyUser(forceUpdate) {
var deferred = $q.defer();
if (cachedUser && !forceUpdate) {
deferred.resolve(cachedUser);
} else {
$http.get('/myresource')
.then(function(data) {
cachedUser = data;
deferred.resolve(data);
},function(error) {
deferred.reject(error);
});
}
return deferred.promise;
}
现在在上面的场景中,如果要从$http.get中删除行“deferred.resolve(data)
”,测试仍然会通过。这是因为包含data.toEqual(myUser)
期望值的回调函数从未运行过。但是,测试应该失败,因为删除该行违背了此功能的目的
我曾在测试代码中尝试将肯定回调设为spy,并期望spy已被调用,但这似乎是在承诺得到解决之前运行的,并且失败了,尽管我可以看到spy的函数是通过控制台日志运行的
我还尝试在单元测试中将承诺放入变量中,然后expect(promise.$$state.status).toEqual(1)
,但再次出现的情况是,该期望在承诺解决之前运行,因此测试在应该通过时失败
请确保您在回答之前理解了问题,如果我不清楚,请发表评论。问题是,在处理$httpBackend时,您必须刷新()后端,请求才能通过。我是在每次测试前后的
afterEach()
块中这样做的,因此当尝试从测试块中测试承诺的状态时,承诺实际上还没有得到解决
通过将$httpBackend.flush()
移动到单元测试中,返回的承诺确实将其状态从0更新为1
以下是最终的单元测试代码:
it('returns my resource', function() {
var myUser = {name:'Bob'}
var promise;
$httpBackend.expectGET('/myresource').respond(200,myUser);
promise = myService.getMyUser()
.then(function(data) {
expect(data).toEqual(myUser);
},fail);
$httpBackend.flush();
expect(promise.$$state.status).toEqual(1);
});
是的,事实上,确切的问题是什么还不够清楚。这个问题没有一个问号。此外,单元测试“承诺永远不会解决”这一短语的含义也不清楚。问题是如何确保单元测试涵盖这样的场景:承诺永远不会解决,这与拒绝承诺不同。$$state.status断言实际上是不必要的。实际问题是缺少
$rootScope.$digest()
。这使得然后部件永远不会运行flush()
也有$digest()
,这就是它开始工作的原因。在测试中,每个$q承诺链应以$rootScope.$digest()
结尾。我建议使用,以保持它的安全性和一致性。