题:
– 当安装ui-router-extras(不是普通的ui-router)时,为什么我的测试失败?
– 我如何使用ui-router-extras仍然让我的测试通过?
如果你想快速安装,请使用yeoman angular-fullstack-generator bower安装ui-router-extras
I found a similar issue with normal ui-router.
>幸运的是,ui-router normal在我的测试中运行得很好.
>安装ui-router-extras后,我收到错误
如果我卸载ui-router.extras它的测试通过就好了:
UPDATED为$urlRouterProvider TEST的beforeEach模块
继承了我的考验:
'use strict';
describe('Controller: MainCtrl',function () {
// load the controller's module
beforeEach(module('morningharwoodApp'));
beforeEach(module('socketMock'));
var MainCtrl,scope,$httpBackend;
// Initialize the controller and a mock scope
beforeEach(
inject( function (_$httpBackend_,$controller,$rootScope) {
$httpBackend = _$httpBackend_;
$httpBackend.expectGET('/api/things')
.respond(['HTML5 Boilerplate','AngularJS','Karma','Express']);
scope = $rootScope.$new();
MainCtrl = $controller('MainCtrl',{
$scope: scope
});
}),module(function ($urlRouterProvider) {
$urlRouterProvider.otherwise( function(){ return false; });
})
);
it('should attach a list of things to the scope',function () {
$httpBackend.flush();
expect(scope.awesomeThings.length).toBe(4);
});
});
这是我的karma.conf
module.exports = function(config) {
config.set({
// base path,that will be used to resolve files and exclude
basePath: '',// testing framework to use (jasmine/mocha/qunit/...)
frameworks: ['jasmine'],// list of files / patterns to load in the browser
files: [
'client/bower_components/jquery/dist/jquery.js','client/bower_components/angular/angular.js','client/bower_components/angular-mocks/angular-mocks.js','client/bower_components/angular-resource/angular-resource.js','client/bower_components/angular-cookies/angular-cookies.js','client/bower_components/angular-sanitize/angular-sanitize.js','client/bower_components/lodash/dist/lodash.compat.js','client/bower_components/angular-socket-io/socket.js','client/bower_components/angular-ui-router/release/angular-ui-router.js','client/bower_components/famous-polyfills/classList.js','client/bower_components/famous-polyfills/functionPrototypeBind.js','client/bower_components/famous-polyfills/requestAnimationFrame.js','client/bower_components/famous/dist/famous-global.js','client/bower_components/famous-angular/dist/famous-angular.js','client/app/app.js','client/app/app.coffee','client/app/**/*.js','client/app/**/*.coffee','client/components/**/*.js','client/components/**/*.coffee','client/app/**/*.jade','client/components/**/*.jade','client/app/**/*.html','client/components/**/*.html'
],preprocessors: {
'**/*.jade': 'ng-jade2js','**/*.html': 'html2js','**/*.coffee': 'coffee',},ngHtml2JsPreprocessor: {
stripPrefix: 'client/'
},ngJade2JsPreprocessor: {
stripPrefix: 'client/'
},// list of files / patterns to exclude
exclude: [],// web server port
port: 8080,// level of logging
// possible values: LOG_disABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel: config.LOG_INFO,// enable / disable watching file and executing tests whenever any file changes
autoWatch: false,// Start these browsers,currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers: ['PhantomJS'],// Continuous Integration mode
// if true,it capture browsers,run tests and exit
singleRun: false
});
};
解决方法
这可能是某些组件依赖于$state的结果,在这种情况下,$state将被实例化并且将执行默认路由.这就是为什么要提取一个控制器main.html的模板的原因.
要绕过这个,用$dlicmies替换$state方法的go()和transitionTo():
beforeEach( inject( function ( _$state_ ) {
state = _$state_;
spyOn( state,'go' );
spyOn( state,'transitionTo' );
} ) );