shmish111 shmish111 - 9 months ago 56
Javascript Question

testing angularjs ui-router go() method

I have a controller which gets a value from

and sends it to a different state:

controllers.controller('SearchController', ['$scope', '$state', '$stateParams',
function($scope, $state, $stateParams) {
$ = function() {
$stateParams.query = $scope.keyword;
$state.go('search', $stateParams);

I am unsure how to go about unit testing this search method. How can I either verify that the go method has been called or do some sort of
when($state.go('search', $stateParams)).then(called = true);
with Karma/AngularJS?


Both of these sound like things you can do with Jasmine spies.

describe('my unit tests', function() {
    beforeEach(inject(function($state) {
        spyOn($state, 'go');
        // or
        spyOn($state, 'go').andCallFake(function(state, params) {
            // This replaces the 'go' functionality for the duration of your test

    it('should test something', inject(function($state){
        // Call something that eventually hits $state.go
        expect($state.go).toHaveBeenCalledWith(expectedState, expectedParams);
        // ...

There is a good spy cheatsheet here or the actual Jasmine docs here.

The nice thing about using spies is that it will let you avoid actually performing the state transition unless you explicitly tell it to. A state transition will fail your unit test in Karma if it changes the URL.