2016-06-30 2 views
0

У меня сейчас проект, нам нужно, чтобы сервер брандмауэра насмехался на данный момент, и мы используем $httpBackend на приложении .run. Мне нужно выполнить тестирование этой службы, которая содержит $httpBackend, поскольку у нас будет огромное количество издевающихся вызовов на сервер, который мы будем покрывать. Так что прямо сейчас это то, что у меня есть. В качестве предисловия к моему вопросу текущая настройка работает, когда я вызываю mockDataService.getWorkflowTask с контроллера на простой странице.

Мой сервер службы замены:

angular.module('app').run(function ($httpBackend, $resource, FakeBackendService) { 
    // TODO: add all necessary http intercepts. 
    $httpBackend.whenGET('JSON file').respond(function (method, url, data) { 
     var request = new XMLHttpRequest(); 
     request.open('GET', url, false); 
     request.send(null); 
     return [request.status, request.response, {}]; 
    }); 
    $httpBackend.whenGET(/.*/).respond(function (method, url, data) { 

     return [200, FakeBackendService.getWorkflowTasks(), {}]; 
    }); 
}); 

Вот сервис для FakeBackendService:

(function() { 
    'use strict'; 

    var injectParams = []; 

    function service(lodash) { 
     var vm = this; 

     var ret = { 
      getWorkflowTasks: getWorkflowTasks 
     }; 

     function getWorkflowTasks() { 
      if (vm.workflowtasks.length < 1) { 
       vm.workflowtasks = loadWorkflowTasks("Some JSON file"); 
      } 
      return vm.workflowtasks; 
     }; 

     function loadWorkflowTasks(file) { 
      var workflowTasks = []; 
      var request = new XMLHttpRequest(); 
      request.open("GET", file, false); 
      request.send(null); 

      if (request.status == 200) { 
       workflowTasks = angular.fromJson(request.response); 
      } 
      return workflowTasks; 
     }; 

     function init() { 
      vm.workflowtasks = []; 
     } 

     init(); 

     return ret; 
    } 

    service.$inject = injectParams; 
    angular.module('mock.FakeBackendService', []).service('FakeBackendService', service); 
})(); 

Так что в настоящее время замены сервера бэкенд издеваться. Ниже приведена моя служба обработки данных, которая содержит вызов $http.get(blah blah blah).

(function() { 
    'use strict'; 

    var injectParams = ['$http', '$q', 'mockConfigService', '$httpBackend']; 

    function factory($http, $q, configService, $httpBackend) { 
     var vm = this; 

     var factory = { 
      getWorkflowTask: getWorkflowTask 
     }; 

     function getWorkflowTask(str) { 
      return getResource(str); 
     } 

     function init() { 
      // Get the URL we will be using to get data from 
      vm.dataServiceURL = configService.getDataServiceURL(); 
     } 

     function getResource(baseResource) { 
      var resource = vm.dataServiceURL + baseResource; 

      return $http.get(resource).then(function (response) { 
       if (typeof response.data == 'object') { 
        // Got valid response 
        return $q.resolve(response.data); 
       } 
       else { 
        // Invalid response 
        return $q.reject(response.data); 
       } 
      }, function (response) { 
       // Something went wrong 
       return $q.reject(response.data); 
      }); 
     } 
     init(); 

     return factory; 
    }; 

    factory.$inject = injectParams; 

    angular.module('mock.dataService', []).factory('mockDataService', factory); 
}()); 

Теперь для испытания единицы жасмина-кармы.

describe("HTTP Backend Mock testing", function() { 

    beforeEach(angular.mock.module("app")); 
    beforeEach(angular.mock.module("mock.FakeBackendService")); 
    beforeEach(angular.mock.module("mock.configService")); 
    beforeEach(angular.mock.module("mock.dataService")); 

    it("Get the workflow task", angular.mock.inject(function (mockDataService) { 
     var valid = ""; 

     var promise = mockDataService.getWorkflowTask('http://localhost/foo'); 

     promise.then(function (response) { 
      valid = "Success"; 
     }, function (response) { 
      valid = "Failure"; 
     }); 

     expect(valid).toBe("Success"); 
    })); 
}); 

Теперь на вопрос. Итак, я начну с того, что я новичок в мире AngularJS и, тем более, с Жасмин. В любом случае, когда я отлаживаю модульный тест, я нахожу, что статус обещания по-прежнему равен 0, и я всегда ожидаю, что '' будет «Успехом», сказав, что я никогда не разрешаю (надеюсь, что я использую правильный жаргон) обещание от службы $http в mockDataService. Я попытался поиграть с ним и попытался выяснить, не сделал ли кто-нибудь подобное раньше. Я нашел множество примеров, где $httpBackend издевается над тестом, но ни один из них не подходит, как я пытаюсь. Любые идеи или предложения были бы замечательными. Благодарю.

EDIT получил немного рабочего раствора

Так что я решил, что я по скоротать run() обслуживание и просто сделать тот же ответ в expectGET().respond().

describe("HTTP Backend Mock testing", function() { 
    beforeEach(angular.mock.module("app")); 
    beforeEach(angular.mock.module("mock.FakeBackendService")); 
    beforeEach(angular.mock.module("mock.configService")); 
    beforeEach(angular.mock.module("mock.dataService")); 

    it("Get the workflow task", angular.mock.inject(function (mockDataService, $httpBackend, FakeBackendService) { 
     var valid = ""; 
     $httpBackend.expectGET('http://server:80/api/foo').respond(200, FakeBackendService.getWorkflowTasks()); 
     var promise = mockDataService.getWorkflowTask('foo'); 


     promise.then(function (response) { 
      valid = "Success"; 
     }, function (response) { 
      valid = "Failure"; 
     }); 
     $httpBackend.flush(); 

     expect(valid).toBe("Success"); 
    })); 
}); 

Этот вид решает мою проблему тестирования с run() как цель состояла в том, чтобы проверить 1) Это согласование регулярных выражений вызова правильный FakeBackendService и 2) То, что FakeBackendService возвращает правильный файл и на самом деле загружает его. Я думаю, что могу сделать это, подражая тому же регулярному выражению в expectGET. Тем не менее, я останусь открытым, чтобы узнать, знает ли кто, как заставить run() работать.

ответ

1

Обещание не собирается разрешаться, если вы не сделаете это для этого до окончания теста. Вот один из способов сделать это:

$httpBackend.expectGET(......).respond(200, 'abc'); 

    var promise = mockDataService.getWorkflowTask('http://localhost/foo'); 

    promise.then(function (response) { 
     valid = "Success"; 
    }, function (response) { 
     valid = "Failure"; 
    }); 

    //new code here 
    $httpBackend.flush(); 

    expect(valid).toBe("Success"); 

Это заставит обещать решить и ваше испытание должно пройти. Вам также понадобится ввести в тест $ httpBackend.

+0

Я попробовал, и я получаю ошибку: Неожиданный запрос: GET HTTP: // бла-бла-бла Нет больше просьба ожидать – DarkLazar

+0

прогресс ... теперь перед вызовом mockDataService.getWorkflowTask (... ..) положил $ httpBackend.expectGET (бла-бла-бла); – Austin

+0

Я ценю это Остин, я пробовал, и я получаю ошибку: никакого ответа не было определено! – DarkLazar

0

angular.module('mock.dataService', []) 
 
    .service('mockDataService', function($http) { 
 
    this.getWorkflowTask = function(url) { 
 
     return $http.get(url) 
 
    } 
 
    }) 
 

 
describe('HTTP Backend Mock testing', function() { 
 
    var $httpBackend 
 
    beforeEach(angular.mock.module("mock.dataService")); 
 
    beforeEach(inject(function(_$httpBackend_) { 
 
    $httpBackend = _$httpBackend_ 
 
    })) 
 

 
    it("Get the workflow task", angular.mock.inject(function(mockDataService) { 
 
    $httpBackend.expectGET('http://localhost/foo').respond(200); 
 

 
    var promise = mockDataService.getWorkflowTask('http://localhost/foo'); 
 

 
    promise.then(function(response) { 
 
     valid = "Success"; 
 
    }, function(response) { 
 
     valid = "Failure"; 
 
    }); 
 

 
    $httpBackend.flush(); 
 

 
    expect(valid).toBe("Success"); 
 
    })); 
 
})
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" /> 
 
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js"></script>

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