2017-02-08 3 views
0

Во-первых, я никогда не видел Angular и Jasmine до нескольких месяцев назад. Поэтому я провожу два или три месяца, изучая это в практике компании, и, наконец, они отправили меня попробовать проверить контроллер/службу в Visual Studio Code.

У меня есть эта переменная в контроллере:

vm.option = $state.param.option; 

И в spec.js создать it с этим:

it('"option" should be defined', function() { 
expect(ctrl.option).toBeDefined(); 
}); 

Раньше я впрыснуть в beforeEach$controller, $rootScope, _$log_, $injector и обслуживание. Мне нужно что-то особенное для проверки этой переменной? Я попытался ввести _$state_, но появляется сообщение Expected undefined to be defined.

Я ценю всю помощь и извиняюсь за мой плохой английский.

Edit:

В spec.js:

'use strict'; 
describe('app/specs/spec.js', function() { 
var scope, $log, service, ctrl, state/*, testedStateExample*/; 
beforeAll(function() {}); 
beforeEach(angular.mock.module('App.moduleExample')); 
beforeEach(function() { 
    module(function ($provide){ 
    $provide.constnt('APP_CONFIG', {}); 
    }); 
}); 
beforeEach(angular.mock.inject(function ($controller, $state, $rootScope, _$log_, _service_){ 
    service = _service_; 
    scope = $rootScope.$new(); 
    $log = _$log_; 
    $state = $state; 

    state = { params: { option: 'E' }} 
    ctrl = $controller('controllerExample', { 
    $scope: scope, 
    service: service, 
    $log: $log 
    }); 

    //testedStateExample = new ctrl(state); 
}); 

it('"option" should be defined', function() { 
    expect(state.params).toBeDefined(); 
}); 
}); 
+0

Это ошибка на ctrl - что у вас есть, что определено как? – rrd

+0

я определил Ctrl здесь:. 'beforeEach (angular.mock.inject (функция (/ * Титулы * /) { обслуживание = _service_; сфера = $ rootScope $ новый(); $ журнал = _ $ log_; $ состояние = _ $ state_; Ctrl = $ контроллера ('обслуживание', { $ Объем: сфера, услуги: услуги, $ журнал: $ журнал, $ состояние: $ состояние}); ' Сбой комментирую это, теперь я редактирую. xDDDD – Kuru

ответ

0

Существует опечатка в контроллере: $state не param имущество, но params. Кроме того, вы должны также определить params.option на инъецированном объекте $state в свои тесты, потому что в инъецированном $state он скорее не установлен, поэтому ваш контроллер не может прочитать его с $state - но как это сделать, это зависит от ваших данных кода. state.params настроены в соответствии с конфигурацией URL и маршрута, но при тестировании автономного контроллера отсутствует URL-адрес или настройка маршрута, и в результате $state.params пуст. Лучший способ решить проблему заключается в псевдотрансфицированные впрыскивается $state: Допустим, что вы следующий контроллер:

function MyController($state) { 
    this.option = $state.params.option 
    ... 
} 

В тестовой спецификации вы можете издеваться $state сервису и передать этот макет в контроллер в качестве аргумента:

var mockState = { 
    params: { 
     option: 'TEST' 
    } 
} 
var testedControllerInstance = new MyController(mockState) 
} 
... 
expect(testedControllerInstance.option).toBe('TEST'); 

обновление ответа в соответствии с обновленным вопросом:

Вы забыли вводить state в контроллер:

beforeEach(angular.mock.inject(function ($controller, $state, rootScope, _$log_, _service_){ 
    service = _service_; 
    scope = $rootScope.$new(); 
    $log = _$log_; 

    var state = { params: { option: 'E' }} 
    ctrl = $controller('controllerExample', { 
    $scope: scope, 
    service: service, 
    $log: $log, 
    $state: state 
    }); 

}); 
... 
}) 

;

+0

Ух ... Надеюсь хорошо вас понять (я тоже чувствую себя новичком: ((). Я ввожу '$ state', а теперь' $ stateParams' тоже. Когда вы вводите что-то, вы должны определить его внутри переменной, не так ли? – Kuru

+0

Мне нужно подтверждение, я это понимаю (извините). Я определил в spec.js переменную, называемую 'stateExample' и' testStateExample', а в beforeEach (где я определяю ctrl) я даю значения, подобные вашему примеру. После изменения «ожидать». 'TypeError: '[object Object]' не является конструктором'. Кажется, это просто, но когда я это делаю, я усложняю свою жизнь. Без 'testStateExample' не удалось, но я думаю, что не использовать $ state, не так ли? – Kuru

+0

Пожалуйста, обновите свой вопрос целым соответствующим кодом (все контрольные и контрольные тесты) –

 Смежные вопросы

  • Нет связанных вопросов^_^