Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 从$http迁移到Restanglar,测试失败_Angularjs_Jasmine_Restangular_Karma Jasmine - Fatal编程技术网

Angularjs 从$http迁移到Restanglar,测试失败

Angularjs 从$http迁移到Restanglar,测试失败,angularjs,jasmine,restangular,karma-jasmine,Angularjs,Jasmine,Restangular,Karma Jasmine,我有以下控制器: 'use strict'; angular.module('App') .controller('LoginCtrl', function ($scope, $state, Login, localStorageService, Message, authService) { $scope.submit = function() { if (this.username) { var credentials = {

我有以下控制器:

'use strict';

angular.module('App')
  .controller('LoginCtrl', function ($scope, $state, Login, localStorageService, Message, authService) {

    $scope.submit = function() {
      if (this.username) {
        var credentials = {
          username: this.username,
          password: this.password
        };

        Login.post(credentials).then(function(data) {
            if (data.status === 200) {
                authService.loadCustomer(data.data);
                $state.go(authService.nextPath() || 'curator');
            }
        },
        function(data) {
          if (data.status === 401) {
            $scope.password = '';
            Message.error('Wrong e-mail/password combination');
          }
          else {
            Message.error('An error occured while logging in.');
          }
        });
      }
    }
});
从使用$http迁移到RestartGular服务:

!(function(window, angular){
    'use strict';

    /**
     * @ngdoc service
     * @name App.Login
     * @description
     * # Login
     * Service in the App, rest interface for login
     */
    function Login(Restangular) {
        return Restangular.service('login');
    }

    angular.module('App')
      .service('Login', Login);
}(window, window.angular));
测试也已迁移:

 'use strict';

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

  // load the controller's module
  beforeEach(module('App'));

  var MainCtrl,
    scope,
    $state,
    $api,
    Login,
    mockedResponses,
    $httpBackend,
    localStorageService;

  // Initialize the controller and a mock scope
  //Use double underline suffix and prefix to prevent shadowing the outer scope dependencies
  //with the inner scope ones
  beforeEach(inject(function ($controller, $rootScope, _$api_, _Message_, _Login_,
                                    _$state_, _$httpBackend_, _mockedResponses_, _localStorageService_) {

    $httpBackend = _$httpBackend_;
    mockedResponses = _mockedResponses_;
    $state = _$state_;
    $api = _$api_;
    Login = _Login_;
    localStorageService = _localStorageService_;
    $httpBackend.whenGET(/views\/login.html/).respond(200, '');
    $httpBackend.whenGET(/views\/curator.html/).respond(200, '');
    $httpBackend.whenGET(/views\/navigation.html/).respond(200, '');

    scope = $rootScope.$new();
    MainCtrl = $controller('LoginCtrl', {
      $scope: scope,
      Login: Login,
      Message: _Message_,
      $state: $state,
      $httpBackend: $httpBackend,
      $stateParams: {}
    });
  }));

  afterEach (function () {
      $httpBackend.verifyNoOutstandingExpectation();
      $httpBackend.verifyNoOutstandingRequest();
  });

  it('should pass login credentials on submit', function(){
    $httpBackend.whenPOST(/login/).respond(mockedResponses.getSuccessfulLoginResponse);
    var spy = spyOn(Login, 'post').and.callThrough();
    scope.username = 'pony@rider.com';
    scope.password = 'yiiihaaa';
    scope.submit();
    $httpBackend.flush();
    scope.$digest();
    expect(spy.calls.argsFor(0).username).toEqual(scope.username);
    expect(spy.calls.argsFor(0).password).toEqual(scope.password);
  });

  it('should remove password if authentication failed', function(){
    $httpBackend.whenPOST(/login/).respond(mockedResponses.getFailedLoginResponse);
    $httpBackend.flush();
    scope.username = 'failedpony@rider.com';
    scope.password = 'yiiihaaa';
    scope.submit();
    $httpBackend.flush();
    scope.$digest();
    expect(scope.password).toEqual('');
  });

  it('should alert user if authentication failed', function(){
    $httpBackend.whenPOST(/login/).respond(mockedResponses.getFailedLoginResponse);
    scope.username = 'failedpony@rider.com';
    scope.password = 'yiiihaaa';
    scope.submit();
    $httpBackend.flush();
  $rootScope.$apply();
    expect(scope.error).toBeDefined();
  });
});
但由于某种原因,我还不能理解,测试失败是因为重新启动语言代码中存在异常:

TypeError: Cannot read property 'replace' of undefined
    at /home/oleg/dev/dashboard/app/components/restangular/dist/restangular.js:680:32
    at Function.reduce (/home/oleg/dev/dashboard/app/components/lodash/dist/lodash.js:3734:25)
    at Path.base (/home/oleg/dev/dashboard/app/components/restangular/dist/restangular.js:649:27)
    at Path.fetchUrl (/home/oleg/dev/dashboard/app/components/restangular/dist/restangular.js:688:36)
    at Array.elemFunction (/home/oleg/dev/dashboard/app/components/restangular/dist/restangular.js:1120:45)
    at bound (/home/oleg/dev/dashboard/app/components/lodash/dist/lodash.js:729:21)
    at Array.postFunction (/home/oleg/dev/dashboard/app/components/restangular/dist/restangular.js:1201:52)
    at Object.bound (/home/oleg/dev/dashboard/app/components/lodash/dist/lodash.js:729:21)
Error: Unflushed requests: 2
    at Function.$httpBackend.verifyNoOutstandingRequest (/home/oleg/dev/dashboard/app/components/angular-mocks/angular-mocks.js:1494:13)
    at Object.<anonymous> (/home/oleg/dev/dashboard/test/spec/controllers/login.js:46:20)
TypeError:无法读取未定义的属性“replace”
at/home/oleg/dev/dashboard/app/components/restangular/dist/restangular.js:680:32
位于Function.reduce(/home/oleg/dev/dashboard/app/components/lodash/dist/lodash.js:3734:25)
在Path.base(/home/oleg/dev/dashboard/app/components/restanglar/dist/restanglar.js:649:27)
在Path.fetchUrl(/home/oleg/dev/dashboard/app/components/restanglar/dist/restanglar.js:688:36)
位于Array.elemFunction(/home/oleg/dev/dashboard/app/components/restanglar/dist/restanglar.js:1120:45)
绑定时(/home/oleg/dev/dashboard/app/components/lodash/dist/lodash.js:729:21)
位于Array.postFunction(/home/oleg/dev/dashboard/app/components/restanglar/dist/restanglar.js:1201:52)
在Object.bound(/home/oleg/dev/dashboard/app/components/lodash/dist/lodash.js:729:21)
错误:未刷新的请求:2
at Function.$httpBackend.verifyNoOutstandingRequest(/home/oleg/dev/dashboard/app/components/angular mocks/angular mocks.js:1494:13)
反对。(/home/oleg/dev/dashboard/test/spec/controllers/login.js:46:20)

看起来Restanglar的baseUrl有问题,请尝试显式设置一个。 类似这样的事情可能会有所帮助:

   angular.module('App').config(function(RestangularProvider) {
       RestangularProvider.setBaseUrl('http://www.yourdomain.com');
   });
问候