I have a config like this one:
angular.module('myModule', ['ui.router'])
.config(['$stateProvider', function($stateProvider) {
$stateProvider
.state('app.home', {
abstract: true,
url: '/home',
template: '<div>Foo Bar</div>'
});
}]);
and a unit test using jasmine like this:
'use strict';
describe('Module: myModule', function() {
var $rootScope, $state;
beforeEach(module('ui.router'));
beforeEach(module('myModule'));
beforeEach(inject(function(_$rootScope_, _$state_) {
$state = _$state_;
$rootScope = _$rootScope_;
}));
it('must have a route state for home', function(){
console.log($state.get('app.home')); // this returns null
});
});
However I could not get the state in the config to show up on the array returned by $state.get()
I also checked and the file containing the config is loaded and it is there. Can anyone say what I am doing wrong? Basically I just want to test if the states I am expecting are existing in the config of "myModule"
The AngularJS UI-Router provides both, a provider called $stateProvider as well as a service called $state. The usage would look like this: // using the $stateProvider!
State corresponds to a "Place" in your Angular application. As this statement does not make sense at the moment, I will clear up this concept in upcoming articles.
This method has two parameters stateName and stateConfig. stateName is a unique state name. For example: it can be /home, /courses, /students, and so on. This is our current output after using UI-Router.
In this article, you will learn about AngularJS UI-Router and Configuring States. In this article, we will learn about UI Router, where to get UI-Router module from, and how to include it in an Angular application. The UI-Router is a third-party routing framework for AngularJS.
First, you don't need this
beforeEach(module('ui.router'));
as your module lists it as a dependency already.
My guess is, you aren't bringing in the parent app
state so your app.home
state will not be created.
Say your app
state is defined in myAppModule
, simply change your module
line to
beforeEach(module('myAppModule', 'myModule'));
If you don't want to include the module with the app
state, include a config function before your module that creates a fake parent state. For this, you will need to include ui.router
.
beforeEach(module('ui.router', function($stateProvider) {
$stateProvider.state('app', { abstract: true });
}, 'myModule'));
Alternatively, you could spy on $stateProvider.state
and use an expect
to ensure it was called with app.home
, eg
var $stateProvider;
beforeEach(module('ui.router', function(_$stateProvider_) {
$stateProvider = _$stateProvider_;
spyOn($stateProvider, 'state');
}, 'myModule'));
it('must have a route state for home', function() {
expect($stateProvider.state).toHaveBeenCalledWith('app.home', jasmine.any(Object));
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With