处理茉莉花中失败的承诺
Handling failed promises in jasmine
我是 jasmine 的新手!
我有以下代码的服务
function getSomeData() {
return $http(
{
method: 'GET',
url: $localStorage.serverName + 'w_service_json.get_wf_proc?pn_login_id=' + sessionService.getUserId()
}).then(function (response) {
var lv_json = JSON.stringify(response.data);
var myArr = JSON.parse(lv_json);
return myArr;
}).catch(function (err) {//console.log(err);
var val = err.message || (err.status==-1?'server error':'error');
errService.add(val);
return err;
});
}
和错误处理服务 (errService) 如下:
angular
.module('err')
.service('errService', errService);
errService.$inject = ['$mdDialog'];
function errService($mdDialog) {
var self = this;
var erros=[];
self.add = add;
self.show = show;
return self;
function add(err)
{
erros.push(err);
throw err;
}
我需要确保服务正在处理错误,所以我在 jasmine 中进行了测试:
beforeEach(inject(function (_errService_,_$rootScope_,_sessionService_,_wfActivitiesRemoteService_,_$localStorage_,_$state_, $httpBackend) {
$scope=_$rootScope_;
errService=_errService_;
wfActivitiesRemoteService = _wfActivitiesRemoteService_;
state=_$state_;
$localStorage=_$localStorage_;
$localStorage.serverName="http://someserverip/";
sessionService=_sessionService_;
httpBackend = $httpBackend;
httpBackend.whenGET(/\.html$/).passThrough();
}));
it("sem sessao", function () {
spyOn(sessionService, "getUserId").and.returnValue("");
httpBackend.expectGET('http://someserverip/w_service_json.get_wf_proc?pn_login_id=').respond(-1,errServer);
var test=function(data)
{
expect(data).toEqual('');
console.log("test");
};
var fail=function(err)
{
expect(err).not.toBeUndefined();
console.log("fail");
};
var run=function()
{
wfActivitiesRemoteService.getSomeData().then(test).catch(fail);
};
expect(function() {wfActivitiesRemoteService.getSomeData}).toThrow('server error');
run();
httpBackend.flush();
});
我无法进入函数内部失败!服务中的promise失败,测试里面没有输入catch,测试自动失败!
我该如何解决这个问题?
解决这个问题的正确方法是什么?
我找到了解决办法!异常需要在测试中捕获,而不是在承诺中!所以我不得不将代码更改为:
var test=function(data)
{
console.log("test:"+data);
expect(data).toEqual('');
};
var fail=function(err)
{
console.log("fail");
expect(err).not.toBeUndefined();
expect(err).toEqual('server error');
};
var run=function()
{
console.log('run');
wfActivitiesRemoteService.getSomeData().then(test).finally(done);
};
try
{
spyOn(sessionService, "getUserId").and.returnValue("");
httpBackend.expectGET('http://someserverip/w_service_json.get_wf_proc?pn_login_id=').respond(-1,errServer);
run();
httpBackend.flush();
}
catch(err)
{
console.log("catch");
fail(err);
}
finally
{
console.log("finally");
done();
}
我仍然认为可能有一种方法可以使用 promise 对其进行测试,但是通过这种方式我已经能够捕获并测试错误。
我是 jasmine 的新手!
我有以下代码的服务
function getSomeData() {
return $http(
{
method: 'GET',
url: $localStorage.serverName + 'w_service_json.get_wf_proc?pn_login_id=' + sessionService.getUserId()
}).then(function (response) {
var lv_json = JSON.stringify(response.data);
var myArr = JSON.parse(lv_json);
return myArr;
}).catch(function (err) {//console.log(err);
var val = err.message || (err.status==-1?'server error':'error');
errService.add(val);
return err;
});
}
和错误处理服务 (errService) 如下:
angular
.module('err')
.service('errService', errService);
errService.$inject = ['$mdDialog'];
function errService($mdDialog) {
var self = this;
var erros=[];
self.add = add;
self.show = show;
return self;
function add(err)
{
erros.push(err);
throw err;
}
我需要确保服务正在处理错误,所以我在 jasmine 中进行了测试:
beforeEach(inject(function (_errService_,_$rootScope_,_sessionService_,_wfActivitiesRemoteService_,_$localStorage_,_$state_, $httpBackend) {
$scope=_$rootScope_;
errService=_errService_;
wfActivitiesRemoteService = _wfActivitiesRemoteService_;
state=_$state_;
$localStorage=_$localStorage_;
$localStorage.serverName="http://someserverip/";
sessionService=_sessionService_;
httpBackend = $httpBackend;
httpBackend.whenGET(/\.html$/).passThrough();
}));
it("sem sessao", function () {
spyOn(sessionService, "getUserId").and.returnValue("");
httpBackend.expectGET('http://someserverip/w_service_json.get_wf_proc?pn_login_id=').respond(-1,errServer);
var test=function(data)
{
expect(data).toEqual('');
console.log("test");
};
var fail=function(err)
{
expect(err).not.toBeUndefined();
console.log("fail");
};
var run=function()
{
wfActivitiesRemoteService.getSomeData().then(test).catch(fail);
};
expect(function() {wfActivitiesRemoteService.getSomeData}).toThrow('server error');
run();
httpBackend.flush();
});
我无法进入函数内部失败!服务中的promise失败,测试里面没有输入catch,测试自动失败!
我该如何解决这个问题? 解决这个问题的正确方法是什么?
我找到了解决办法!异常需要在测试中捕获,而不是在承诺中!所以我不得不将代码更改为:
var test=function(data)
{
console.log("test:"+data);
expect(data).toEqual('');
};
var fail=function(err)
{
console.log("fail");
expect(err).not.toBeUndefined();
expect(err).toEqual('server error');
};
var run=function()
{
console.log('run');
wfActivitiesRemoteService.getSomeData().then(test).finally(done);
};
try
{
spyOn(sessionService, "getUserId").and.returnValue("");
httpBackend.expectGET('http://someserverip/w_service_json.get_wf_proc?pn_login_id=').respond(-1,errServer);
run();
httpBackend.flush();
}
catch(err)
{
console.log("catch");
fail(err);
}
finally
{
console.log("finally");
done();
}
我仍然认为可能有一种方法可以使用 promise 对其进行测试,但是通过这种方式我已经能够捕获并测试错误。