Karma Angular 单元测试一个从未解决的承诺
Karma Angular Unit test a promise never being resolved
我正在努力确保我的单元测试用例涵盖承诺从未得到解决的场景,但我遇到了一些问题。
一个代码块值一千个字,所以..
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);
});
一切都很好,测试响应是否符合预期,如果承诺被拒绝,测试也会失败。
但是,如果 promise 根本没有被解决,那么测试通过了,我希望它失败。我像这样在 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)
期望值的回调函数永远不会是 运行。但是测试应该会失败,因为删除该行会破坏此函数的目的。
我已经在测试代码中尝试将正向回调设为间谍并期望间谍 toHaveBeenCalled,但这似乎 运行 在 promise 解决之前失败了,即使我可以看到间谍的功能运行 通过控制台日志。
我也曾尝试在单元测试中将 promise 放入一个变量中,然后 expect(promise.$$state.status).toEqual(1)
,但在解决 promise 之前,这种期望似乎又是 运行,因此测试失败什么时候应该过去。
请确保您在回答之前了解问题,post如果我不清楚,请发表评论。
原来的问题是,在处理 $httpBackend 时,您必须 flush() 后端才能使请求通过。我在每个测试周围的 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);
});
我正在努力确保我的单元测试用例涵盖承诺从未得到解决的场景,但我遇到了一些问题。
一个代码块值一千个字,所以..
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);
});
一切都很好,测试响应是否符合预期,如果承诺被拒绝,测试也会失败。
但是,如果 promise 根本没有被解决,那么测试通过了,我希望它失败。我像这样在 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)
期望值的回调函数永远不会是 运行。但是测试应该会失败,因为删除该行会破坏此函数的目的。
我已经在测试代码中尝试将正向回调设为间谍并期望间谍 toHaveBeenCalled,但这似乎 运行 在 promise 解决之前失败了,即使我可以看到间谍的功能运行 通过控制台日志。
我也曾尝试在单元测试中将 promise 放入一个变量中,然后 expect(promise.$$state.status).toEqual(1)
,但在解决 promise 之前,这种期望似乎又是 运行,因此测试失败什么时候应该过去。
请确保您在回答之前了解问题,post如果我不清楚,请发表评论。
原来的问题是,在处理 $httpBackend 时,您必须 flush() 后端才能使请求通过。我在每个测试周围的 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);
});