Как правильно использовать toHaveBeenCalled () для модульного тестирования?

0

Мне нужно написать тест, который устанавливает состояние, затем тест, чтобы узнать, вызвано ли stateManagerService. Я получаю сообщение об ошибке:

undefined не является объектом (оценка "vm.stateManagerService.go")

main.controller.js

export class MainController {
    constructor($state, stateManagerService) {
        'ngInject';
        this.$state = $state; 
        if($state.current.name === 'main') {
            stateManagerService.go('list');
        }
    }

}

unit test main.controller.spec.js

describe('controllers', () => {
    let vm;

    //
    beforeEach(inject(($controller, $state, stateManagerService) => {
        vm = $controller('MainController');

    }));

    it('should call stateManagerService when current name is main', ()=> {
        vm.$state.current.name = 'main'
        console.log(vm.$state.current.name)
        expect(vm.stateManagerService.go()).toHaveBeenCalled();
    });

Также (слегка не по теме) я все еще смущен, почему это. $ State = $ state требуется. Если не указано, я получаю сообщение об ошибке: состояние $ undefined.

Обновление: теперь получение ошибок

Ошибка: spyOn не смог найти объект для шпионажа для go() (строка 1887)

TypeError: undefined не является объектом (оценка "vm.stateManagerService.go")

stateManager.service.js

export class StateManagerService {
    constructor($state, $stateParams, platformDetectService){
        'ngInject';
        //deps
        this.$state = $state;
        this.$stateParams = $stateParams;
        this.isMobile = platformDetectService.isMobile;

        //internal
        this.lastStateName = null;
        this.lastStateParams = null;
    }

    //storage method for current state
    go (stateName, params){
        this.lastStateParams = this.$stateParams.page;
        this.lastState = this.$state.current.name.split('.')[1];



        let nextState = (this.isMobile) ? 'mobile.' + stateName : 'map.' + stateName;

        this.$state.go(nextState, params)
    }

    //returns last state or list
    goBack (){
        let lastState = this.lastState || 'list',
            page = this.lastStateParams || null;

        this.go(lastState, {page})
    }

}
  • 0
    Не забудьте шпионить за своим vm.stateManagerService.go помощью spyOn(vm.stateManagerService, 'go')
  • 0
    Документация по .toHaveBeenCalled для шпионов и .toHaveBeenCalled - jasmine.github.io/2.0/introduction.html#section-Spies без вызова простоты метода
Теги:
unit-testing
jasmine
constructor

1 ответ

1

Вам нужно проверить на указателе функции, а не на возвращаемом значении функции.

Это должно было быть

expect(vm.stateManagerService.go).toHaveBeenCalled();

Обратите внимание на отсутствие () в go

Ещё вопросы

Сообщество Overcoder
Наверх
Меню