我正在为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(...)
块。我得到的错误是:
可能未处理的拒绝:未定义抛出
我不明白自己在做什么。
答案 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,但是我只是内联返回它们。