Подтвердить что ты не робот

Как использовать mock $httpBackend для проверки ветки ошибки

Я следую документации AngularJS здесь

Проблема заключается в том, что в документации описывается только "успешная/счастливая" ветвь кода, и нет примера того, как тестировать ветвь "failure".

Что я хочу сделать, это установить предварительное условие для запуска кода $scope.status = 'ERROR!'.

Вот минимальный пример.

// controller
function MyController($scope, $http) {

  this.saveMessage = function(message) {
    $scope.status = 'Saving...';
    $http.post('/add-msg.py', message).success(function(response) {
      $scope.status = '';
    }).error(function() {
      $scope.status = 'ERROR!';
    });
  };
}

// testing controller
var $httpBackend;

beforeEach(inject(function($injector) {
  $httpBackend = $injector.get('$httpBackend');
}));

it('should send msg to server', function() {

  $httpBackend.expectPOST('/add-msg.py', 'message content').respond(500, '');

  var controller = scope.$new(MyController);
  $httpBackend.flush();
  controller.saveMessage('message content');
  $httpBackend.flush();

  // Here is the question: How to set $httpBackend.expectPOST to trigger
  // this condition.
  expect(scope.status).toBe('ERROR!');
});

});
4b9b3361

Ответ 1

Вы проверяете свойство controller, пока вы устанавливаете свойство области.

Если вы хотите протестировать controller.status в своем вызове expect, вы должны установить this.status внутри своего контроллера вместо $scope.status.

С другой стороны, если вы установите $scope.status в своем контроллере, вы должны использовать scope.status вместо controller.status в своем вызове expect.


UPDATE: я создал рабочую версию для вас в Plunker:

http://plnkr.co/edit/aaQ7JQV9WlXhou0PYHTn?p=preview

Все тесты проходят сейчас...