在 Karma 单元测试中使用 ui-router 和指令时出现意外 GET
Unexpected GET when using ui-router and directive in Karma unit test
我刚刚切换到使用 ui-router。我有一个调用 templateURL 的简单导航栏指令,但在 Karma 单元测试中它导致了异常
Error: Unexpected request: GET /directives/nav-bar/nav-bar.html
No more request expected
导航栏指令:
'use strict';
angular.module('kitchenapp')
.directive('navBar', function () {
return {
restrict: 'E',
templateUrl: '/directives/nav-bar/nav-bar.html'
};
});
导航栏规范:
'use strict';
describe('Directive: nav-bar', function () {
beforeEach(module('kitchenapp', 'templates'));
var element, scope;
beforeEach(inject(function ($compile, $rootScope, $httpBackend) {
scope = $rootScope.$new();
element = angular.element('<nav-bar></nav-bar>');
element = $compile(element)(scope);
scope.$apply();
//$httpBackend.expectGET("/directives/nav-bar/nav-bar.html");
$urlRouterProvider.otherwise(function(){return false;});
}));
it('\'s brand link should be titled \'KitchenApp\' and should navigate to the root address when clicked', function () {
console.log('Element', element);
});
});
正如您在规范中看到的那样,我在 beforeEach 中尝试了很多方法,但似乎没有什么不同。
非常感谢任何帮助。
编辑
Karma.conf.js
'use strict';
module.exports = function (config) {
config.set({
basePath: 'client',
frameworks: ['jasmine'],
preprocessors: {
'**/*.html': ['ng-html2js']
},
ngHtml2JsPreprocessor: {
stripPrefix: 'client/',
moduleName: 'templates'
},
plugins: [
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-ng-html2js-preprocessor'
],
files: [
'bower_components/angular/angular.js',
'bower_components/angular-ui-router/release/angular-ui-router.js',
'bower_components/angular-mocks/angular-mocks.js',
'bower_components/angular-bootstrap/ui-bootstrap-tpls.js',
'bower_components/angular-ui-grid/ui-grid.js',
'bower_components/angular-ui-calendar/src/calendar.js',
'bower_components/angular-animate/angular-animate.js',
'bower_components/angular-sanitize/angular-sanitize.js',
'bower_components/angular-cookies/angular-cookies.js',
'bower_components/angular-resource/angular-resource.js',
'bower_components/angular-socket-io/socket.min.js',
'app.js',
'views/**/*.js',
'services/**/*.js',
'directives/**/*.js',
'directives/**/*.html',
'filters/**/*.js'
],
exclude: [
'views/**/*.e2e.js',
'services/socket/socket.service.js'
],
reporters: ['progress'],
port: 9876,
colors: true,
// possible values:
// config.LOG_DISABLE
// config.LOG_ERROR
// config.LOG_WARN
// config.LOG_INFO
// config.LOG_DEBUG
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: ['PhantomJS'],
singleRun: true
});
};
对!!明白了!!
好的,所以我使用 karma-ng-html2js-preprocessor 将我的文件从 .html 转换为 .html.js 文件,以便注入到页面中。如果您指定一个模块名称,那么您不必单独调用它们。
这里的问题主要是路径。我使用了 bangular 并且以某种方式在模板指令中添加了前面的斜杠,但在视图中没有。确保你做对了...
使用 ui-router 时,您需要访问 $urlRouterProvider - 您必须使用模块来完成,注入服务无法找到它。如果您将它包含在一系列参数中,那么注入器将完全失效并且将提供 none(有关更多信息,请参见 )...
上面提供的 link @Christt 将在您进行单元测试时进一步帮助您,尽管我无法获得 '$urlRouterProvider.deferIntercept();'以任何有意义的方式工作...
我刚刚切换到使用 ui-router。我有一个调用 templateURL 的简单导航栏指令,但在 Karma 单元测试中它导致了异常
Error: Unexpected request: GET /directives/nav-bar/nav-bar.html No more request expected
导航栏指令:
'use strict';
angular.module('kitchenapp')
.directive('navBar', function () {
return {
restrict: 'E',
templateUrl: '/directives/nav-bar/nav-bar.html'
};
});
导航栏规范:
'use strict';
describe('Directive: nav-bar', function () {
beforeEach(module('kitchenapp', 'templates'));
var element, scope;
beforeEach(inject(function ($compile, $rootScope, $httpBackend) {
scope = $rootScope.$new();
element = angular.element('<nav-bar></nav-bar>');
element = $compile(element)(scope);
scope.$apply();
//$httpBackend.expectGET("/directives/nav-bar/nav-bar.html");
$urlRouterProvider.otherwise(function(){return false;});
}));
it('\'s brand link should be titled \'KitchenApp\' and should navigate to the root address when clicked', function () {
console.log('Element', element);
});
});
正如您在规范中看到的那样,我在 beforeEach 中尝试了很多方法,但似乎没有什么不同。
非常感谢任何帮助。
编辑 Karma.conf.js
'use strict';
module.exports = function (config) {
config.set({
basePath: 'client',
frameworks: ['jasmine'],
preprocessors: {
'**/*.html': ['ng-html2js']
},
ngHtml2JsPreprocessor: {
stripPrefix: 'client/',
moduleName: 'templates'
},
plugins: [
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-ng-html2js-preprocessor'
],
files: [
'bower_components/angular/angular.js',
'bower_components/angular-ui-router/release/angular-ui-router.js',
'bower_components/angular-mocks/angular-mocks.js',
'bower_components/angular-bootstrap/ui-bootstrap-tpls.js',
'bower_components/angular-ui-grid/ui-grid.js',
'bower_components/angular-ui-calendar/src/calendar.js',
'bower_components/angular-animate/angular-animate.js',
'bower_components/angular-sanitize/angular-sanitize.js',
'bower_components/angular-cookies/angular-cookies.js',
'bower_components/angular-resource/angular-resource.js',
'bower_components/angular-socket-io/socket.min.js',
'app.js',
'views/**/*.js',
'services/**/*.js',
'directives/**/*.js',
'directives/**/*.html',
'filters/**/*.js'
],
exclude: [
'views/**/*.e2e.js',
'services/socket/socket.service.js'
],
reporters: ['progress'],
port: 9876,
colors: true,
// possible values:
// config.LOG_DISABLE
// config.LOG_ERROR
// config.LOG_WARN
// config.LOG_INFO
// config.LOG_DEBUG
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: ['PhantomJS'],
singleRun: true
});
};
对!!明白了!!
好的,所以我使用 karma-ng-html2js-preprocessor 将我的文件从 .html 转换为 .html.js 文件,以便注入到页面中。如果您指定一个模块名称,那么您不必单独调用它们。
这里的问题主要是路径。我使用了 bangular 并且以某种方式在模板指令中添加了前面的斜杠,但在视图中没有。确保你做对了...
使用 ui-router 时,您需要访问 $urlRouterProvider - 您必须使用模块来完成,注入服务无法找到它。如果您将它包含在一系列参数中,那么注入器将完全失效并且将提供 none(有关更多信息,请参见
上面提供的 link @Christt 将在您进行单元测试时进一步帮助您,尽管我无法获得 '$urlRouterProvider.deferIntercept();'以任何有意义的方式工作...