Angular Code Coverage неправильный вывод

Мой стек: Angular.js, Karma, Karma-coverage (Стамбул) и Jasmine.

Я выполняю анализ покрытия кода для своего приложения, проблема и, следовательно, вопрос заключается в том, что я получаю Service A, помеченный как пройденный тестами (зеленый), хотя на самом деле не имеет любые связанные тесты.

Подозреваю, что виноват следующий сценарий:

  • Я знаю, что служба A используется контроллером B.
  • Контроллер B покрыт тестами, и результаты покрытия кода правильно отмечают его как пройденный тестами.
  • Служба A не имитируется при тестировании контроллера B.

Я думаю, что поскольку сервис A косвенно вызывается тестами контроллера B, я получаю неправильный результат.

Есть идеи? Правильно ли я подозреваю? Есть ли способы обойти это, чтобы я мог получить точный результат тестового покрытия в этом аспекте?

Заранее спасибо!


person franleplant    schedule 18.11.2014    source источник


Ответы (1)


К сожалению, именно так оценивается покрытие кода. Если код выполняется, он считается «накрытым». К счастью, есть кое-что, что вы можете сделать, чтобы уменьшить количество ложных срабатываний. Вы можете издеваться над своими зависимостями!

В следующем примере будет запущен жасминовый шпион вместо реальной службы:

describe('Controller Tests', function() {
  var $scope, mockServiceA;

  beforeEach(module('app', function($provide) {
    mockServiceA = jasmine.createSpyObj('mockServiceA', ['foo']);
    $provide.value('ServiceA', mockServiceA);
  }));

  beforeEach(inject(function($rootScope, $controller) {
    $scope = $rootScope.$new();
    $controller('ControllerB', {
      $scope: $scope
    });
  }));

  describe('ControllerB', function() {
    it('should call mock service', function() {
      expect(mockServiceA.foo).not.toHaveBeenCalled();
      $scope.useServiceA();
      expect(mockServiceA.foo).toHaveBeenCalled();
    });
  });
});

Вот рабочий плункер: http://plnkr.co/edit/x8gQQNsHT0R5n5iJSxKw?p=info

person Brian Lewis    schedule 19.11.2014