【发布时间】:2014-11-16 23:21:24
【问题描述】:
我正在使用 angular 和 jasmine 的组合测试控制器,但我不完全确定是否使用延迟承诺。
这是我的规范代码。
describe('Controller Tests', function(){
var scope, searchAPI;
beforeEach(function(){
var mockSearchAPI = {};
module('myApp', function($provide){
$provide.value('searchAPI', mockSearchAPI);
});
});
inject(function($q){
var testData = {"message":"hi"};
mockSearchAPI.executeSearch = function(){
var defer = $q.defer();
defer.resolve(testData);
return defer.promise;
};
});
beforeEach('Main Search Controller Tests', function(){
function($controller, $rootScope, _searchAPI_){
scope = $rootScope.$new();
searchAPI = _searchAPI_;
$controller('MainSearchCtrl', function(){
$scope: scope,
searchAPI: searchAPI
});
scope.$digest();
}
});
it('should return a promise correctly', function(){
var field = "testfield";
var value = "testvalue";
var pageNumber = 1;
var promise = scope.processQueryByField(field, value, pageNumber);
//THIS LINE IS GIVING ME '{}'
alert(promise);
});
});
我不确定为什么我“警告”的那一行会输出“{}”。不应该是我在注入函数中定义为“testData”的数据结构吗?我不确定这里发生了什么。我尝试了很多解决方案。
我的控制器代码基本上是服务的包装器
$scope.processQueryByField = function(field, value, pageNumber){
return searchAPI.executeSearch(field, value, pageNumber);
}
我不应该只接收我在注入器代码中定义的值吗?
【问题讨论】:
-
searchAPI.executeSearch返回一个承诺,对吗?所以最终processQueryByField也会返回一个数据不正确的承诺?那么你想要设定的期望是什么?更重要的是,您需要掌握$rootScope并在调用函数后应用摘要,然后再设置期望值。 -
我只是想确保我的模拟设置正确(即返回一个承诺),并且我能够进行更复杂的测试。在设置期望值之前获取 $rootScope 并应用摘要是什么意思?
-
it('should invoke execute search', function(){ spyOn(mockSearchAPI,'executeSearch'); var field = "testfield"; var value = "testvalue"; var pageNumber = 1; scope.processQueryByField(field, value, pageNumber); expect(mockSearchAPI.executeSearch).toHaveBeenCalled(); expect(mockSearchAPI.executeSearch).toHaveBeenCalledWith(field, value, pageNumber); }); -
我会详细说明我的意思。
标签: angularjs unit-testing jasmine deferred angular-promise