Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Вместо этого используйте $ 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');
});
});
Я предполагаю, что здесь есть несколько переменных, но давайте начнем с теста. Во-первых, вам не нужно «издеваться над этим», потому что вы запускаете тест 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
, чтобы вы могли запускать те тесты в консоли.
angular.mock
, чтобы запустить ее. Но основная проблема заключалась в том, что функция mock всегда возвращала свойствоundefined
в href (даже оно было отличным от пустого). Итак, я должен был получить толькоwindowObj.location
. Конечно, возвращаемое значение было другим, но это просто проблема синтаксического анализа. Знаю, почему? – Hugoren Martinako 18 June 2015 в 08:22$window.location = url + "/" + msg + "/attachment";
вместо$window.location.href
, не так ли? – Wawy 18 June 2015 в 08:27windowObj
работает (и ожидаемый ответ). В противном случае у вас будет хост undefined i>, но правильный путь. – Hugoren Martinako 18 June 2015 в 13:12