0

Я пытаюсь написать единичный тест, чтобы протестировать простой factory, который выполняет http.get для извлечения файла JSON.AngularJS - Единичный тест для http-доступа к файлу JSON

Завод вызван внутри моего контроллера.

Вот plunker показывает мой http.get: http://plnkr.co/edit/xg9T5H1Kreo4lwxzRQem?p=preview

Ctrl:

app.controller('MainCtrl', function($scope, $http, factoryGetJSONFile) { 

    factoryGetJSONFile.getMyData(function(data) { 
    $scope.Addresses = data.Addresses.AddressList; 
    $scope.People = data.Names.People; 
    }); 

}); 

Factory:

app.factory('factoryGetJSONFile', function($http) { 
    return { 
    getMyData: function(done) { 
     $http.get('data.json') 
     .success(function(data) { 
     done(data); 
     }) 
     .error(function(error) { 
     alert('An error occured whilst trying to retrieve your data'); 
     }); 
    } 
    } 
}); 

Тест:

// ---SPECS------------------------- 

describe('with httpBackend', function() { 
    var app; 
    beforeEach(function() { 
     app = angular.mock.module('plunker') 
    }); 

    describe('MyCtrl', function() { 
     var scope, ctrl, theService, httpMock; 

     beforeEach(inject(function ($controller, $rootScope, factoryGetJSONFile, $httpBackend) { 
      scope = $rootScope.$new(), 
      ctrl = $controller('MyCtrl', { 
       $scope: scope, 
       factoryGetJSONFile: theService, 
       $httpBackend: httpMock 
      }); 
     })); 

     it("should make a GET call to data.json", function() { 
       console.log("********** SERVICE ***********"); 
        httpMock.expectGET("data.json").respond("Response found!"); 
       //expect(factoryGetJSONFile.getMyData()).toBeDefined(); 
       httpMock.flush(); 
      }); 

    }) 
}); 

Ошибка:

TypeError: 'undefined' is not an object (evaluating 'httpMock.expectGET') 
+0

где вы определении объекта Theservice? – sam

+0

, так как ваш код теперь будет компилироваться, только если вы запишете factoryGetJSONFile: factoryGetJSONFile, но он просто вызовет исходную услугу. Вы должны определить макет службы и поместить ее в службу – sam

ответ

2

Вы должны назначить $httpBackend к httpMock в beforeEach, как это:

beforeEach(inject(function ($controller, $rootScope, factoryGetJSONFile, $httpBackend) { 
     httpMock = $httpBackend; 
     scope = $rootScope.$new(); 
     ctrl = $controller('MyCtrl', { 
      $scope: scope, 
      factoryGetJSONFile: factoryGetJSONFile, 
      $httpBackend: httpMock 
     }); 
    })); 
+0

, почему ее определить в параметрах beforeEach и внутри ctrl? –

+0

попробовал ваш код, получи ошибку: Ошибка: Неожиданный запрос: GET /data.json? Ожидаемый GET /data.json Где находится? приходящий из?? –

Смежные вопросы