处理茉莉花中失败的承诺

时间:2016-10-24 17:16:35

标签: angularjs jasmine karma-runner

我是茉莉花的新手!

我的服务包含以下代码

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;
        }

我需要确保服务正在处理错误,所以我在茉莉花中进行了测试:

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();


});

我无法进入功能失败!服务中的承诺失败,测试自动失败而没有进入测试内的捕获!

我该如何解决这个问题? 解决这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!需要在测试中捕获异常而不是承诺!所以我不得不将代码更改为:

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();
    }

我仍然认为可能有一种方法可以用承诺来测试它,但通过这种方式,我已经能够捕获并测试错误。