【发布时间】:2016-10-26 16:33:06
【问题描述】:
我是茉莉花的新手!
我有以下代码的服务
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!
我该如何解决这个问题? 解决这个问题的正确方法是什么?
【问题讨论】:
-
正确的做法是使用
$httpBackend.whenGET()并告诉它如何响应以便它击中你的捕获。 docs.angularjs.org/api/ngMock/service/$httpBackend#whenGET -
toThrow断言的使用不正确(除了那里没有调用 getSomeData 的事实)。被拒绝的承诺不会抛出。 -
getSomeData 没有被调用,因为一个错字。对不起!
-
如果我使用 whenGet 而不是 expectGet 它不会等待调用退出之前的测试,它不会接受 http.flush 并在没有输入任何功能的情况下给我一个错误的成功。 ng-learn.org/2014/08/Testing_Promises_with_Jasmine
-
没想到会抛出我得到这个:test sem sessao FAILED server error throw。期待我得到:test sem sessao FAILED Expected function to throw an exception.ServiceSpec.js:118:40 loaded@localhost:9876/context.js:151:17 server error throw
标签: angularjs jasmine karma-runner