2015-10-08 4 views
0

Я следующий завод, который я хотел бы тест:карма издеваться обещание ответ

angular 
    .module('enigma.authFactory', [])  
    .factory('authFactory', authFactory); 

authFactory.$inject = ['$http']; 

function authFactory($http){ 
    function doesUserExist(email){ 
     return $http.post('/doesUserExist', email) 
      .success(function(data){ 
       if(data !== 'user exists'){ 
        return false; 
       } else { 
        return true; 
       } 
      }); 
    } 
} 

Так что я написал следующий тест:

describe('Auth Service Tests', function() { 
    var $httpBackend, defer, doesUserExistReqHandler; 

    beforeEach(inject(function(_$httpBackend_, $injector, $q) { 
     $httpBackend = _$httpBackend_; 
     defer = $q.defer(); 
     doesUserExistReqHandler = $httpBackend.when('POST', '/doesUserExist').respond(defer.promise); 
    })); 

    describe('authFactory.doesUserExist()', function() { 
     it('should return true is a user exists', function() { 
      user = { 
       email: '[email protected]' 
      }; 
      $httpBackend.whenPOST('/doesUserExist', user).respond('user exists'); 
      var doesUserExist = authFactory.doesUserExist(user); 
      $httpBackend.flush(); 
      expect(doesUserExist).toEqual(true); 
     }); 
    }); 
}); 

я проверил внутри функции authFactory.doesUserExist и Я правильно получаю набор данных «user exists», который перенаправляет функцию для возврата true. Однако в модульном тесте authFactory.doesUserExist устанавливается на следующий объект.

Expected Object({ $$state: Object({ status: 1, pending: undefined, value: Object({ data: Object({ $$state: Object({ status: 0 }) }), status: 200, headers: Function, config: Object({ method: 'POST', transformRequest: [ Function ], transformResponse: [ Function ], paramSerializer: Function, url: '/doesUserExist', data: Object({ email: '[email protected]' }), headers: Object({ Accept: 'application/json, text/plain, */*', Content-Type: 'application/json;charset=utf-8' }) }), statusText: '' }), processScheduled: false }), success: Function, error: Function }) to equal true. 

Я думаю, вопрос в том, что тест не решает обещание должным образом и поэтому я установив Рез переменным перед authFactory.doesUserExist вернулось верно.

Как я могу это исправить?

ответ

1

Так что вам нужно кое-что сделать, чтобы ваш код работал с тем, что у вас есть.

Вот демо http://plnkr.co/edit/4GvMbPJgc0HcJcgFZ4DL?p=preview

  1. Ваша служба (завод) должен возвращать объект.
  2. Вы не возвращаете обещание после своего почтового столба $ http.
    • Я рекомендую вам воспользоваться услугой $ q.

В тестировании

  1. Вам необходимо импортировать модуль.
  2. Обязательно впрыснуть к вашим услугам
  3. Вы должны удалить $httpBackend.when('POST', '/doesUserExist').respond(defer.promise);, так как он ничего не взятыми, и это на самом деле получить его запутаться в других $httpBackend.whenPost.
  4. Вы должны утверждать данные ответа вместо обещания, потому что authFactory.doesUserExist(user) возвращает обещание.

Код:

var doesUserExist = authFactory.doesUserExist(user) 
    .then(function (data) { 
    responseData = data; 
    }); 

$httpBackend.flush(); 
expect(responseData).toEqual(true); 
Смежные вопросы