1

我应该使用 jasmine 模拟一个 ajax 调用。

以下是我的代码片段。

var httpBackend;
var http;

beforeEach(inject(function ($injector) {
    $httpBackend = $injector.get('$httpBackend');
    scope = $injector.get('$rootScope').$new();
    var $controller = $injector.get('$controller');
    var MainCtrl = $controller('scanningClientsController',
        { $scope: scope });
}));

   it("Verify Ajax Call", function () {    
    var test;
    $httpBackend.expectGET(scope.requestUrl).respond([{}, {}, {}]);      
    scope.GetClients().then(function (response) {
        test = response;
    });
    $httpBackend.flush(); 
    expect(test.length).toBe(3);

我在控制器中的功能如下:

  $scope.GetClients =
         function () {
             $http({
                 method: 'GET',
                 url: $scope.requestUrl,
             }).success(function (response, status, headers, config) {
                 $scope.scanningClientsList = response.data;

             }).error(function (data, status, headers, config) {

             });
         };

现在我得到一个错误

TypeError: 'undefined' is not an object (evaluating 'scope.GetClients().then')

尝试从这个http://chutzpah.codeplex.com/workitem/230修复

但这似乎无法解决问题。有任何想法吗?

4

1 回答 1

1

您还需要注入 $httpBackend :

$httpBackend = $injector.get('$httpBackend');

编辑

你没有在你的$scope.GetClients函数中返回承诺,所以你实际上是在调用thenundefined..

尝试这样的事情:

 $scope.GetClients =
     function () {
         var deferred = $q.defer();
         $http({
             method: 'GET',
             url: $scope.requestUrl,
         }).success(function (response, status, headers, config) {
             $scope.scanningClientsList = response.data;
             deferred.resolve(response.data);

         }).error(function (data, status, headers, config) {
             deferred.reject(data);
         });
         return deferred.promise;
     };
于 2014-06-25T11:20:15.637 回答