2016-03-24 144 views
1

我有以下的角度服務和模擬/測試設置。我無法讓模擬http請求正常工作。我從我的工廠返回一個承諾,並讓HTTP請求被模擬,但控制器範圍內的數據不是工廠調用的http服務返回的數據。您可以看到,我在$rootScope$httpBackend上調用$digest()。我很茫然。茉莉花模擬使用承諾的角度服務

您可以從小提琴中看到代碼正常工作並顯示來自服務的文本,但模擬不起作用。

爲什麼?

的小提琴是在這裏:https://jsfiddle.net/mbaranski/gnxxbgy3/ 以下是代碼:

var myApp = angular.module('myApp', []); 
var ep = '/echo/json/'; 
myApp.factory('dataFactory', function($http) { 
    var getData = function() { 
    var data = $.param({ 
     json: JSON.stringify({ 
     name: "Name from Echo Service" 
     }) 
    }); 
    return $http.post(ep, data); 
    } 

    return { 
    getData: getData 
    } 
}); 

myApp.controller('MyCtrl', function($scope, dataFactory) { 
    $scope.name = 'Original Name'; 
    dataFactory.getData().then(function(data) { 
    $scope.name = data.data.name; 
    }); 
}); 

describe('Test For Site', function() { 
    beforeEach(angular.mock.module('myApp')); 
    var $controller; 
    var $httpBackend; 
    var $q; 
    var $rootScope; 
    beforeEach(angular.mock.inject(function(_$controller_, _$httpBackend_, _$q_, _$rootScope_) { 
    $controller = _$controller_; 
    $httpBackend = _$httpBackend_; 
    $q = _$q_; 
    $rootScope = _$rootScope_; 
    })); 

    describe('test pageController', function() { 
    it('Should pass', function() { 
     var scope = {}; 
     $httpBackend.expect('POST', ep); 
     $httpBackend.whenPOST(ep, function(str) { 
     return true; 
     }).respond(
     function() { 
      return { 
      name: "Name from Echo Service" 
      }; 
     }); 
     var controller = $controller('MyCtrl', { 
     $scope: scope, 
     }); 
     $httpBackend.flush(); 
     $rootScope.$digest(); 
     $rootScope.$flush(); 

     expect(scope.name).toBe('Name from Echo Service'); 
    }); 
    }); 
}); 

這裏的HTML

<div ng-controller="MyCtrl"> 
    Hello, {{name}}! 
</div> 
<br/> 

回答

1

我真的很微小的問題,這花了很多找到它。 .whenPOST$httpBackend只應該返回object/string &您正在返回的是從.respond..whenPOST方法返回的函數。

只是通過返回普通的JSON,而不是返回function解決了這個問題。

代碼

$httpBackend.whenPOST(ep, function(str) { 
    return true; 
}).respond({ 
    name: "Name from Echo Service" 
}); 

同時刪除$rootScope.$flush();此行。 $rootScope其中沒有$flush方法。

Forked JSFiddle