Как издеваться над $ window.location.href в карме [дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

12
задан Hugoren Martinako 17 June 2015 в 15:26
поделиться

2 ответа

Вместо этого используйте $ window :

var secure = angular.module('secure', []);
secure.controller('ProcedureController', ProcedureController);
ProcedureController.$inject = ['$controller', '$rootScope', '$scope', '$http', '$window'];

function ProcedureController($controller, $rootScope, $scope, $http, $window) {

  ... // Controller does more stuff

  var href = $window.location.href.split('/');
  var baseUrl = href[0] + '//' + href[2];
  var url = baseUrl + "/secure/regulations";

  $http.get(url)
    .success(function (data) {
        $scope.questions = data[0];
    })

  $scope.download = function (msg) {
    $window.location = url + "/" + msg + "/attachment";
  }
}

describe('ProcedureController', function () {
  var windowObj = {location: {href: ''}};

  beforeEach(mock.module(function($provide) {
     $provide.value('$window', windowObj);
  }));
  beforeEach(module('secure'));

  beforeEach(inject(function ($rootScope, $http, $controller, $injector) {
    scope = $rootScope.$new();
    ProcedureController = $controller('ProcedureController', {
        $scope: scope,
        $http: $http
    });
  }));

  it ('should download something', function() {
    expect(scope.download).toBeDefined();
    scope.download(1);
    expect(windowObj.location.href).toEqual('/secure/regulations/1/attachment');
  });

 });
13
ответ дан Wawy 17 August 2018 в 14:35
поделиться
  • 1
    Очень благодарен! Просто небольшая обратная связь: во-первых, мелочь, мне пришлось добавить angular.mock, чтобы запустить ее. Но основная проблема заключалась в том, что функция mock всегда возвращала свойство undefined в href (даже оно было отличным от пустого). Итак, я должен был получить только windowObj.location. Конечно, возвращаемое значение было другим, но это просто проблема синтаксического анализа. Знаю, почему? – Hugoren Martinako 18 June 2015 в 08:22
  • 2
    В коде вы назначаете $window.location = url + "/" + msg + "/attachment"; вместо $window.location.href, не так ли? – Wawy 18 June 2015 в 08:27
  • 3
    Yepp! Достаточно близко! Просто добавление поддельного хоста к windowObj работает (и ожидаемый ответ). В противном случае у вас будет хост undefined , но правильный путь. – Hugoren Martinako 18 June 2015 в 13:12

Я предполагаю, что здесь есть несколько переменных, но давайте начнем с теста. Во-первых, вам не нужно «издеваться над этим», потому что вы запускаете тест Jasmine через Karma, который загружает какую-то форму браузера. Надеюсь, вы используете PhantomJS вместо чего-то вроде Chrome.

Но давайте начнем с PhantomJS. Код для вашего теста должен выглядеть примерно так:

it ('should download something', function() {
  scope.download(1);
  expect(window.location).toBeDefined();
  expect(window.location).toBe('some static URL that it should be');
});

Однако вам нужно исправить инициализацию для вашего контроллера. Вы должны убедиться, что вы можете удовлетворить эту строку:

var href = window.location.href.split('/');

Это означает, что при создании вашего контроллера здесь:

ProcedureController = $controller('ProcedureController', {

вам понадобится чтобы установить window.location на что-то перед выполнением $controller, чтобы он правильно сгенерировал переменную url.

Теперь, если вы используете Chrome, вы, вероятно, увидите реальное движение в браузере. Я не думаю, что это вызовет проблемы, но это просто не обязательно. Лучше всего использовать PhantomJS, чтобы вы могли запускать те тесты в консоли.

0
ответ дан Mike Perrenoud 17 August 2018 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: