2015-06-29 1 views
1

У меня есть некоторые проблемы с вводом моей фабрики в спецификацию тестирования. Я использую requireJS внедрить контроллеры и заводы и т.д.Невозможно ввести завод в контроллер в Жасмин (requireJS)

define(['controller', 'loginFactory', 'angular', 'angularMocks'], 

     function(ctrl, loginFactory, angular){ 

     var scope, 
      OnBoardingCtrl; 

     describe('Controller: OnBoarding', function() { 

      beforeEach(angular.mock.inject(function ($rootScope, $controller, $location) { 

      angular.module('app'); 

      scope = $rootScope.$new(); 

      OnBoardingCtrl = $controller(ctrl, { 
       '$scope': scope, 
       'loginFactory': loginFactory, 
      }); 


      })); 

     it('Should check endpoint', inject(function ($http, $httpBackend) { 

     var successCallback = jasmine.createSpy(); 
     var url = 'login?un=test&pw=test'; 

     var response = {"token":1} 

     $httpBackend.expectGET(url) 
      .respond(200, response); 

     $http.get(url).success(successCallback); 

     expect(successCallback).not.toHaveBeenCalled(); 

     $httpBackend.flush(); 

     expect(successCallback.token).toBe(1); 

     })); 
    }); 
    } 
); 

Как всегда я получаю TypeError: «не определено» не является объектом (оценка «successCallback.token) Для справки мой LoginFactory выглядит следующим образом:

var LoginFactory = function ($q, $http) { 

    return { 
     getData: function (url) { 
     var deferred = $q.defer(); 
     $http.get('http://local/'+url) 
      .then(function() { 
      deferred.resolve(true); 
      }, function() { 
      deferred.resolve(false); 
      }); 

     return deferred.promise; 
     } 
    }; 

    }; 

    LoginFactory.$inject = ['$q', '$http']; 
    factories.factory('LoginFactory', LoginFactory); 

    return LoginFactory; 

Заранее благодарен!

+0

Как вы думаете, 'LoginService. $ Inject' должно быть' LoginFactory. $ Inject'? Мы указываем зависимости для объекта LoginFactory, а не LoginService – Arkantos

+0

Да, должно быть, я обновил – Ben

ответ

0

Как уже упоминался, successCallback.token это точка, где ваш код ломает, потому что jasmine.createSpy() возвращает функцию, но она не имеет ни малейшего представление о вашем token от вашего притворного ответа обслуживаемого $httpBackend. Из официального docs,

When there is not a function to spy on, jasmine.createSpy can create a “bare” spy. This spy acts as any other spy – tracking calls, arguments, etc. But there is no implementation behind it. Spies are JavaScript objects and can be used as such.

Поэтому удаление этой строки expect(successCallback.token).toBe(1); будет устранить ошибку, но если вы действительно хотите, чтобы проверить фиктивный ответ от $ httpBackend, что вам нужно сделать, что в success обратного вызова на $ HTTP (или) then метод объекта Promise, как ниже

$http.get(url).success(function(response){ 
    expect(response.token).toBe(1); 
}); 

Обратите внимание, что здесь я только изменил свой код, чтобы показать пример, в идеале вы не код вызова HTTP отдельно в тестовом случае, вы вызываете действительную функцию делая HTTP вызывать и проверять ожидания.

Для получения дополнительной информации о $httpBackend, посмотрите на это link.

+0

Спасибо. Я понимаю, что я должен сделать запрос к фактической функции, создающей запрос HTTP. Однако, когда я это делаю, я вызываю LoginFactory.getData (url), он возвращает 'undefined, не является функцией (оценка ...), которую я предполагаю, потому что он не может найти метод getData? – Ben

Смежные вопросы