无法将工厂注入Jasmine的控制器(requireJS)

时间:2015-06-29 16:59:50

标签: javascript angularjs jasmine

我有一些问题将我的工厂注入测试规范。我正在使用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:' undefined'不是对象(评估' 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;

提前致谢!

1 个答案:

答案 0 :(得分:0)

正如您已经提到的那样,100是您的代码破解的重点,因为successCallback.token会返回一个函数,但它不会对您jasmine.createSpy()的{​​{1}}提供token。 1}}。来自官方docs

  

当没有窥探功能时,jasmine.createSpy可以创建一个“裸”间谍。     这个间谍扮演任何其他间谍 - 跟踪调用,参数等。       但它背后没有实施。间谍是JavaScript对象       并且可以这样使用。

因此,删除此行$httpBackend将解决错误,但如果您确实要验证来自$ httpBackend的模拟响应,则需要在$ {http(或者)中的expect(successCallback.token).toBe(1);回调中执行此操作承诺对象的success方法如下

then

请注意,我在这里修改了您的代码以显示示例,理想情况下,您不必在测试用例中单独编写HTTP调用代码,调用实际函数进行HTTP调用并验证期望。

有关 $http.get(url).success(function(response){ expect(response.token).toBe(1); }); 的详细信息,请查看此link