Как да направя единичен тест за Http Get, без да използвам http бекенд, вместо това искам да се подигравам на бекенда, използвам jasmine и Angular 1?

Как да направя единичен тест за Http Get, без да използвам http бекенд, искам да се подигравам на бекенда, вместо да правя истинско обаждане с http бекенд.

Използвам Jasmine, Karma runner с Angular версия 1?

Това е текущият ми код, който работи, но използва Http Backend:

describe('appService', function() {
    beforeEach(module('msApp.services'));
    beforeEach(module('msApp.environment'));

    var scope, appServiceMock, httpBackendMock, environment;

    describe('service tests', function() {
        beforeEach(inject(function($rootScope, $injector, Environment) {      
              scope = $rootScope.$new();    
              environment = Environment;

              //I want to mock the httpBackend bit here:
              httpBackendMock = $injector.get('$httpBackend');  
              appServiceMock = $injector.get('AppService');    
        }));

        afterEach(function() {
            httpBackendMock.verifyNoOutstandingExpectation();
            httpBackendMock.verifyNoOutstandingRequest();
        });          

        it('Test 1 - call login user', function() {  
            var user = {};

            spyOn(appServiceMock, 'loginUser');   

            appServiceMock.loginUser(user, jasmine.any(Function), jasmine.any(Function));

            expect(appServiceMock.loginUser).toHaveBeenCalledWith(user, jasmine.any(Function), jasmine.any(Function));
        });

        it("Test 2 - call http directly", function(){
            var taskId = 1;

            httpBackendMock.expectGET(environment.apiURL + 'Tasks/GetTask?sessionId='+ scope.session + "&taskId=" + taskId)
            .respond(200, data);

            function mockSuccessFunction(){return true;};

            appServiceMock.getTask(taskId, mockSuccessFunction, jasmine.any(Function));                                  

            httpBackendMock.flush(); 
        })              
    });
});

person AngularM    schedule 18.03.2016    source източник
comment
Това не прави истинско обаждане, вие му се подиграхте, като му казахте да отговори с вашите данни   -  person Mathew Berg    schedule 18.03.2016
comment
Това ли е правилният начин да се направи този тип модулен тест?   -  person AngularM    schedule 18.03.2016


Отговори (3)


Не мога да си спомня подробностите, но го направих преди много време, като използвах $httpBackend, но му казах да предава обажданията към действителния интернет по следния начин:

$httpBackend.whenGET(/regex/).passThrough();

---актуализация---

Току-що попаднах на кода, където го направих. Подробностите са тук: http://www.bradoncode.com/blog/2015/06/16/unit-test-http-ngmock-passthrough/

person Alex028502    schedule 18.03.2016

Използвах angular-resource.js в моето приложение, за да се подигравам с бекенда. Просто трябва да добавите модула ngResource и да извикате $resource("api/url/:id") за крайните точки, които искате да макетирате.

person fireydude    schedule 18.03.2016

Бихте могли да предоставите макет $http вместо да получите действително инжектирана услуга.

describe('appService', function() {
  beforeEach(module('msApp.services'));
  beforeEach(module('msApp.environment'));

  var $http, scope;

  describe('service tests', function() {
    beforeEach(inject(function($rootScope, $provide) {      
          scope = $rootScope.$new();    
          $http = jasmine.createSpyObj('$http', ['get']);
          $provide.value('$http', $http);    
    }));
    it('get data', function() {
     $http.get();
     expect($http.get).toHaveBeenCalled();
    });
  });
});
person gmuraleekrishna    schedule 20.03.2016