mercredi 27 mai 2015

angular empty $state name when testing routing with jasmine

Like many folks, I'm new to testing Angular with Jasmine and am struggling to get this right. I use ui-router to do my routing and right now, the problem I'm having is that the $state.current.name in the test is an empty string and I have no idea why it does that.

This is the code in my routing module:

var cacRouteViewMod = angular.module('cacRouteViewMod', ['ui.router', 'cacLib']);

cacRouteViewMod.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {

  $stateProvider
  .state('countries', {
    url: '/countries',
    templateUrl: 'countries/countries.html',
    controller: 'countriesCtrl',
    resolve : {
      countries: ["getCountry", function(getCountry) {
        return getCountry();
      }]
    }
  });

}]);

and the test I wrote is this:

describe('cac_app_views (routing)', function() {

  var $rootScope,
      $state,
      $injector,
      getCountryMock,
      state = 'countries';

  beforeEach(function() {

    module('cacRouteViewMod', function($provide, $urlRouterProvider) {
      $urlRouterProvider.deferIntercept();
      $provide.value('getCountry', getCountryMock = {});
    });

    inject(function(_$rootScope_, _$state_, _$injector_, $templateCache) {
      $rootScope = _$rootScope_;
      $state     = _$state_;
      $injector  = _$injector_;
      $templateCache.put('countries/countries.html', '');
    })
  });

  // Test 1
  it('should respond to URL', function() {
    expect($state.href(state)).toEqual('#/countries');
  });

  // Test 2
  it('should resolve getCountry', function() {
    getCountryMock = jasmine.createSpy('getCountry').and.returnValue('nanana');

    $rootScope.$apply(function() {
      $state.go('countries');
    });

    expect($state.current.name).toBe('countries');
    expect($injector.invoke($state.current.resolve.countries)).toBe('nanana');
  });
});

Test 1 is fine, but test 2 is the issue. The test fails because it expected '' to be 'countries'.

When I log $state.current to the console it gives

Object {name: "", url: "^", views: null, abstract: true}

I'm getting pretty desperate at this point. Could anyone help me understand/solve this problem?

Aucun commentaire:

Enregistrer un commentaire