1

У меня есть трудное понимание модульных тестов в angularJs. Я только что начал с модульных тестов, и синтаксис мне кажется странным. Ниже приведен код для тестирования controller:Контроллеры модульных испытаний в угловыхJS

describe('PhoneCat controllers', function() { 

    describe('PhoneListCtrl', function(){ 

    beforeEach(module('phonecatApp')); 

    it('should create "phones" model with 3 phones', 
    inject(function($controller) { 
     var scope = {}, 
     ctrl = $controller('PhoneListCtrl', {$scope:scope}); 

     expect(scope.phones.length).toBe(3); 
    })); 

    }); 
}); 

Что я могу понять из этого синтаксиса, что перед каждым это блок phonecatApp инициализирован и что $ контроллер сервис используется для получения экземпляра контроллера PhoneListCtrl ,

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

ctrl = $controller('PhoneListCtrl', {$scope:scope}); 

ответ

0

Обычно во время выполнения угловой создает область и вводит ее в функцию контроллера для ее создания. В своем модульном тесте вместо этого вы хотите создать область самостоятельно и передать ее функции контроллера, чтобы иметь возможность увидеть, действительно ли у нее 3 телефона после построения (например).

Возможно, вы также захотите ввести ложные сервисы вместо настоящих в свой контроллер. Это то, что массив объектов позволяет в

$controller('PhoneListCtrl', {$scope:scope}); 

Это говорит Угловая: создать экземпляр контроллера с именем «PhoneListCtrl», но вместо того, чтобы создавать и нагнетание сферы, используйте один я даю вам.

Если ваш контроллер зависит от службы «phoneService», и вы хотите, чтобы ввести макет phoneService, вы могли бы сделать

var mockPhoneService = ...; 
$controller('PhoneListCtrl', { 
    $scope: scope, 
    phoneService: mockPhoneService 
}); 
+0

var scope = {} определяется, и мы передаем область как параметр в PhoneListCtrl. Таким образом, он станет локальной переменной для этого контроллера. Как он указывает на область var = {} снаружи. Я знаю, что здесь происходит что-то еще, и я думаю совершенно неправильно. Пожалуйста, направляйте. – roshan

+0

Ваш контроллер определяется как 'app.controller ('PhoneListCtrl', function ($ scope) {...})'. Этот аргумент $ scope вводится угловым. В вашем тесте вместо того, чтобы создавать область и вводить ее, угловой принимает тот, который вы передаете в качестве аргумента, и вводит его. –

+0

Но область действия будет локальной для этой функции, как она изменяет область var = {}, определенную снаружи. – roshan

1

Это не нужно вводить сферу, вы можете напрямую использовать экземпляр контроллера для вызова функций контроллера и objects.In вашего примера вы можете использовать, как показано ниже, это даст тот же результат, установленный как вашего покорного

describe('PhoneCat controllers', function() { 

    describe('PhoneListCtrl', function(){ 

    beforeEach(module('phonecatApp')); 

     it('should create "phones" model with 3 phones', 
      inject(function($controller) { 

     var ctrl = $controller('PhoneListCtrl'); 

    expect(ctrl.phones.length).toBe(3); 
    })); 

    }); 
}); 

и для вас информации каждый раз, когда контроллер инстанцированный он связан с $ рамки переменная, которая равна der ived из $ rootScope (то есть: ребенок корнеплодов). Поэтому вам нужно передать $ scope, чтобы захватить экземпляр контроллера, и я делаю то же самое в приведенном выше примере.

+0

Кажется, лучше синтаксис, но он не работает. Пожалуйста, проверьте. – roshan

+0

Ваша версия работает, когда я использую this.phones без ввода $ scope в PhoneListCtrl. Пожалуйста, поправьте меня, если я ошибаюсь. – roshan