Как выполнить модульный тест для Http Get без использования HTTP-бэкэнда, вместо этого я хочу имитировать бэкэнд, я использую жасмин и Angular 1?

Как выполнить модульный тест для Http Get без использования HTTP-бэкэнда, я хочу имитировать бэкэнд вместо того, чтобы делать настоящий вызов с HTTP-бэкэндом.

Я использую Jasmine, Karma runner с Angular версии 1?

Это мой текущий код, который работает, но использует серверную часть HTTP:

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