根据 angular.js 来源:
$q promises 被模板引擎以角度识别,这意味着在模板中,您可以将附加到范围的 promises 视为结果值。
所以,我有一个从后端获取类别列表的控制器,
function myController($scope, $categoryService) {
...
$scope.categoriesList = categoryService.search().then(function(response) {
return response;
}
...
}
在我的模板中,我有一个选择:
<select multiple ng-model="categories" ng-options="category.name for category in categoriesList"></select>
在浏览器中“工作”(选择显示填充列表)
但是你如何测试这个?
我有以下规格:
it('populates the categoriesList from the categoryService', inject(function(categoryService, $q, $controller, $rootScope) {
var $scope = $rootScope.$new();
var catList = [{id:1, name:"Animal"},{id:2, name:"Vegetable"}];
var deferred = $q.defer()
spyOn(categoryService, 'search').andReturn(deferred.promise);
$controller(myController, {'$scope': $scope});
expect(categoryService.search).toHaveBeenCalled(); // PASSES
deferred.resolve(catList);
$scope.$digest();
expect($scope.categoriesList).toEqual(catList); // FAILS, returns the promise instead
}));
如果我像这样重写我的初始化程序
...then(function(response) {
$scope.categoriesList = response;
}
我的测试会通过,但是我没有将承诺分配给范围,模板引擎也没有为我解决承诺。在我看来,第一个实现是框架的意图,但它是不可测试的。第二种实现是可测试的,但不是将数据附加到范围的预期方式。