Как заставить тест Jasmine завершиться неудачей при запуске кода

#javascript #node.js #angularjs #jasmine

#javascript #node.js #angularjs #jasmine

Вопрос:

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

 it('should succeed to login the user', function () {
  var params = {
      email: 'foo@bar.com',
      password: 'hunter2'
  };
  var member = {
      remoteAddress: '1.2.3.4'
  };
  $httpBackend.expectPOST(fakeApiUrl   '/1/authentication/login', params)
      .respond(200, member);
  auth.login(params.email, params.password).then(
      function (m) {
          expect(m.remoteAddress).toBe(member.remoteAddress);
      },
      function () {
          // I want this to be fail()
          expect(true).toBe(false);
      }
  );
  $rootScope.$digest();
  $httpBackend.flush();
});
 

Проблема в том, что для того, чтобы выполнить тест с ошибкой, если этот обратный вызов запущен, я должен сделать что-то грязное, например expect(true).toBe(false) .

Есть ли лучший способ добиться этого? Например, есть ли более подходящий сопоставитель, который я мог бы использовать, или я должен структурировать свой тест по-другому?

Комментарии:

1. Может быть, передать spy ( jasmine.createSpy() ) в качестве обратного вызова ошибки и проверить с expect(mySpy).not.toHaveBeenCalled(); помощью?

2. Посмотрите на шпионов

3. В связи с предложениями spy взгляните на поддержку асинхронного тестирования в версии 2.0 и в версии 1.3 .

4. auth.login должен вернуть обещание, которое вы должны отклонить.

5. @KrzysztofSafjanowski: Что вы имеете в виду?

Ответ №1:

Один из способов сделать это — создать шпиона и утверждать, что шпион никогда не вызывался…

 var mySpy = jasmine.createSpy('mySpy');

$httpBackend.expectPOST(fakeApiUrl   '/1/authentication/login', params)
  .respond(200, member);
auth.login(params.email, params.password).then(
  function (m) {
      expect(m.remoteAddress).toBe(member.remoteAddress);
  },
  mySpy
);
$rootScope.$digest();
$httpBackend.flush();

expect(mySpy).not.toHaveBeenCalled();
 

Комментарии:

1. @cdmckay — пожалуйста, объясните мне, как вы хотите протестировать обратный вызов mySpy, который должен быть исправлен при ошибке?

Ответ №2:

 it('should succeed to login the user', function () {
    var params = {
        email: 'foo@bar.com',
        password: 'hunter2'
    };

    auth.login = jasmine.createSpy().andReturn($q.reject());

    auth.login(params.email, params.password).then(

    function (m) {
        expect(m.remoteAddress).toBe(member.remoteAddress);
    },

    function () {
        // I want this to be fail()
        expect(true).toBe(false);
    });

    $scope.$digest();
});
 

http://jsfiddle.net/zk8Lg/1/