AngularJS茉莉花测试-从callFake函数返回被拒绝的诺言

时间:2018-08-02 11:03:28

标签: angularjs jasmine

我正在为AngularJS控制器编写一些测试。我到了一个要点,即当服务调用因承诺被拒绝而失败时,我想测试视图模型中的变量是否分配了特定值。 我的 controller 的代码如下:

(function() {
  'use strict';
  angular.module('example')
    .controller('ExampleController', ['ExampleService1', 'ExampleService2', ExampleController]);

  function ExampleController(ExampleService1, ExampleService2) {
    var vm = this;

    vm.myVariable = null;

    init();

    function init() {
      ExampleService1.callSomeMethod()
        .then(ExampleService2.callMethodThatFails)
        .then(function(result) {
          //do something with result
        })
        .catch(function(error) {
          vm.myVariable = "N/A";
        })
    }
  }
})();

下面是我的测试代码:

// ---
//ignore test initialization for brevity
it('should set the value of myVariable to N/A', function() {
    spyOn(ExampleService2, 'callMethodThatFails').and.callFake(function(param0) {
        return getResponse(param0, null, null);
    })

    $injector.get('$controller')('ExampleController as vm', {
        '$scope': $scope
    })
    $rootScope.$apply();

    expect($scope.vm.myVariable).toBe('N/A')
})

function getResponse(param0, param1, param2) {
    var promise1 = param1 === null ? $q.reject() : $q.resolve(param1);
    var promise2 = param2 === null ? $q.reject() : $q.resolve(param2);

    if (angular.equals(param0, something1)) {
        return promise1;
    } else if (angular.equals(param0, something2)) {
        return promise2;
    } else {
        $q.reject('Some custom error message')
    }
}

当我调试该测试时,一切都按预期工作:调用控制器中init()函数的catch块,并将值'N / A'分配给vm.myVariable。 问题是我的测试失败,并且代码未到达expect(...)块。我得到的错误是:

  

可能未处理的拒绝:未定义抛出

我不明白自己在做什么。

1 个答案:

答案 0 :(得分:0)

好吧,所以我设法解决了这个问题,但是我不知道为什么新版本有效而​​旧版本无效。

我会在这里回答这个问题,希望我能从你们那里得到更多的线索。我唯一需要更改的是getResponse函数:

function getResponse(param0, param1, param2) {
    if (angular.equals(param0, something1)) {
        return param1 === null ? $q.reject() : $q.resolve(param1);
    } else if (angular.equals(param0, something2)) {
        return param2 === null ? $q.reject() : $q.resolve(param2);
    } else {
        $q.reject('Some custom error message')
    }
}

基本上,我不会在if / else语句之前初始化promise,但是我只是内联返回它们。