2014-12-17 3 views
1

Я только что прочитал много статей об издевательском $ http и что-то не так с моим кодом. У меня все еще есть ошибка: Нет ожидающего запроса на сброс!Жасмин угловатый - насмешливый http-запрос

Мой метод из controllers.js похож на это (browserDebugMode, WebRoot, commentsAction глобальные переменные - это не миль идея сделать его глобальным: D)

$scope.getComments = function(){ 
     if (browserDebugMode) { 
      $http({ 
       method : "GET", 
       url  : webRoot+commentsAction, 
       params : {action: "list"}, 
      }) 
       .success(function(data, status) { 
        //... 
       }) 
       .error(function(data, status) { 
        //... 
       });  
     } 
} 

А теперь тест на него:

var browserDebugMode = true; 
var webRoot = "http://localhost/name"; 
var commentsAction = '/commentsMobile.php'; 

describe('myApp', function() { 
var scope, 
    httpBackend, 
    http, 
    controller; 

beforeEach(angular.mock.module('myApp')); 

describe('NewsDetailCtrl', function() { 

    beforeEach(inject(function ($rootScope, $controller, $httpBackend, $http) { 
     scope = $rootScope.$new(); 
     httpBackend = $httpBackend; 
     http = $http; 
     httpBackend.when("GET", webRoot+commentsAction).respond([{}]); 
     controller = $controller('NewsDetailCtrl', { 
      '$scope': scope, 'GlobalService': globalService, $http: $http 
     }); 
    })); 

    it('checks if AJAX is done', function() { 
     httpBackend.expectGET(webRoot+commentsAction).respond([{}]); 
     scope.getComments() 
     httpBackend.flush(); 
    }); 
    }); 

}); 

И, пожалуйста, не запрашивайте PHP-скрипт :) Мне было предложено сделать это.

Я просто хочу проверить, могу ли я проверить $ http, ничего более. Я не знаю, что я делаю неправильно. Я тестировал другие вещи в этом контроллере, и все было в порядке, я посмотрел, запущен ли getComments() с console.log, и он уволен. Что-то должно быть неправильно с настройкой.

ответ

1

Ваш тестируемый код и модульные тесты выполняются в разных контекстах, поэтому они будут иметь разные глобальные объекты, поэтому browserDebugMode, который существует в ваших тестах, отличается от кода вашего фактического кода.

Контроллер должен вводить $window (обертку ANGULAR по всему window объекта), а затем проверить browserDebugMode свойство, что:

if ($window.browserDebugMode) { 
    // actual code 
} 

Испытания должны также впрыснуть $window, а затем установить browserDebugMode свойство, что:

beforeEach(inject(function ($window) { 
    $window.browserDebugMode = true; 
})); 

Теперь и контроллер, и тесты будут ссылаться на один и тот же глобальный объект, состояние if shoul d оценивать значение true, а вызов $http должен выполняться.