我们对我们的控制器进行单元测试我们已经成功地嘲笑了对我们的REST服务层的调用,并验证了它正在使用给定的数据进行调用.现在我们想测试一下,在我们的控制器中,执行这个承诺会改变location.path:
控制器:
(function () {
app.controller('registerController',['$scope','$location','$ourRestWrapper',function ($scope,$location,$ourRestWrapper) {
$scope.submitReg = function(){
// test will execute this
var promise = $ourRestWrapper.post('user/registration',$scope.register);
promise.then(function(response) {
console.log("success!"); // test never hits here
$location.path("/");
},function(error) {
console.log("error!"); // test never hits here
$location.path("/error");
}
);
};
$ourRestWrapper.post(url,data)只包含Restangular.all(url).post(data)..
我们的测试:
(function () {
describe("controller: registerController",function() {
var scope,location,restMock,controller,q,deferred;
beforeEach(module("ourModule"));
beforeEach(function() {
restMock = {
post: function(url,model) {
console.log("deferring...");
deferred = q.defer();
return deferred.promise;
}
};
});
// init controller for test
beforeEach(inject(function($controller,$rootScope,$ourRestWrapper,$q){
scope = $rootScope.$new();
location = $location;
q = $q;
controller = $controller('registerController',{
$scope: scope,$location: location,$ourRestWrapper: restMock});
}));
it('should call REST layer with registration request',function() {
scope.register = {data:'test'};
spyOn(restMock,'post').andCallThrough();
scope.submitReg();
deferred.resolve();
// successfull
expect(restMock.post).toHaveBeenCalledWith('user/registration',scope.register);
expect(restMock.post.calls.length).toEqual(1);
// fail: Expected '' to be '/'.
expect(location.path()).toBe('/');
});
在我们的控制台中,我们看到“推迟…”,前两个预期成功.为什么它不会调用当前块(即设置位置)?

