Я новичок в разработке angular и пытаюсь научиться тестировать контроллеры angular. Контроллер, который я тестирую, использует $ location.seach (). Something. Я просмотрел документы для $ location, но не сразу понял, как я должен издеваться над этим в karma / jasmine.

Контроллер:

rmtg.controller('ErrorCtrl', ['Session', '$location', '$routeParams', '$scope', '$window',
    function(Session, $location, $routeParams, $scope, $window) {
        console.log('ErrorCtrl(%o, %o, %o)', $location.path(), $location.search(), $routeParams);

        $scope.status = $location.search().status;
        $scope.message = $location.search().message;

        $scope.isAuthorized = (typeof(Session.auth) === 'object');

        $scope.signin = function() {
             $window.location = '/signin/#/' + $routeParams.origin + (Session.auth ? '?email=' + Session.auth.email : '');
        };
     }]);

Моя текущая попытка спецификации:

'user strict';

describe('Testing the errorCtrl controller', function(){
    beforeEach(module("rmtg"));

    var errorCtrl, scope;

    beforeEach(inject(function($controller, $rootScope){
        scope = $rootScope;
        errorCtrl = $controller("ErrorCtrl", {
            $scope: scope
        });
    }));


   it('$scope.status should be set to 404 when location is set to 404', function(){
        //set the $location.search values so that the scope is correct
        $location.search('status', '404');
        expect(scope.status).toBe('404');
    });
});

И текущее сообщение об ошибке: Тестирование контроллера errorCtrl $ scope.status должно быть установлено на 404, когда location установлено на 404 FAILED. Ожидаемое значение undefined равно «404». на объекте. (/Users/adamremeeting/git/mrp-www/app/tests/example.js:20:24)

Я также был бы очень признателен за ссылки на ресурсы на tdd с angular 1.5 и за то, как я правильно издеваюсь и заглушаю.

Изменить после ответа

Поэтому я обновил тест в соответствии с предложениями пользователя 2341963 и приложил все усилия, чтобы просмотреть его пример с плунжером, но все еще не прошел проходной тест.

Текущая спецификация (контроллер не изменился сверху)

'user strict';

describe('ErrorCtrl', function(){
    beforeEach(module("rmtg"));

    var scope, $location, $controller;

    beforeEach(inject(function(_$controller_, _$rootScope_, _$location_){
        scope = _$rootScope_.$new();
        $location = _$location_
        $controller = $_controller_;
    }));


    describe('$scope.status', function(){
        it('should set status to 404', function(){
            //set the $location.search values so that the scope is correct
            $location.search('status', '404');
            //init controller
            $controller('ErrorCtrl', {
                $scope: scope,
                $location: $location
            });
            expect(scope.status).toBe('404');
        });
    });
});

Но теперь я получаю сообщение об ошибке, что $ controller не определен.

1
AdamCooper86 24 Фев 2016 в 01:05

1 ответ

Лучший ответ

Вы получаете undefined в вашем тесте, потому что вы нигде не устанавливаете $location.

В зависимости от вашего контроллера параметры поиска должны быть установлены до инициализации контроллера. См. Полный пример plunker.

describe('testApp', function() {

  describe('MainCtrl', function() {
    var scope, $location, $controller;

    beforeEach(module('myApp'));

    beforeEach(inject(function(_$rootScope_, _$controller_, _$location_) {
      scope = _$rootScope_.$new();
      $location = _$location_;
      $controller = _$controller_;
    }));

    it('should set status to 404', function() {
      // Set the status first ...
      $location.search('status', '404');      
      // Then initialise the controller
      $controller('MainCtrl', {
        $scope: scope,
        $location: $location
      });
      expect(scope.status).toBe('404');
    });
  });
});

Что касается ресурсов, пока я обнаружил, что angular docs достаточно хороши.

3
kevin 24 Фев 2016 в 04:30
Спасибо за уделенное время. Я получаю сообщение об ошибке $ _controller_ не определен. Итак, где я должен был определить подчеркнутую версию?
 – 
AdamCooper86
24 Фев 2016 в 20:55
Ничего страшного, это была опечатка с моей стороны, я не привык к синтаксису инжектора.
 – 
AdamCooper86
24 Фев 2016 в 21:10