我有一个单页的Angular应用程序与Rails后端。我在我的index.html文件中使用一个标签,但是当我使用Karma运行我的前端单元测试,我得到这样:
$location in HTML5 mode requires a <base> tag to be present
我在主要的.js文件中这样做:
angular.module('my.module').config( function($locationProvider,$routeProvider) { $locationProvider.html5Mode( true ); }
所以,有没有任何方式,我可以注入一个< base>元素在karma实际呈现的页面?或者,告诉Angular / Karma在运行单元测试时忽略此错误?
更新
This Google Groups thread和this GitHub issue都描述了这个问题,但是在这两种情况下,解决方案都是简单地提升Angular的版本。我做到了,我甚至可以看到在angular-mocks.js中的行,其中默认的baseHref设置…
这里是有问题的规格:
describe 'amnResource',-> $compile = null $rootScope = null beforeEach -> module 'ngMock' module 'amn' module 'directive.template.cache' inject([ '$compile','$rootScope',($c,$r) -> $compile = $c $rootScope = $r ]) it 'compiles to an article',-> console.log $rootScope console.log $rootScope.foo $rootScope.foo = title: 'Foo' excerpt: 'foo bar qux' element = $compile('<amn-resource resource="foo"></amn-resource>')($rootScope) console.log element.html() console.log $rootScope.foo expect( element.html() ).toMatch /Foo/
Karma输出:
Running "karma:unit" (karma) task INFO [karma]: Karma v0.12.28 server started at http://localhost:9876/ INFO [launcher]: Starting browser Chrome INFO [Chrome 39.0.2171 (Mac OS X 10.9.5)]: Connected on socket hOvsC6ji15heHZmiHxJt with id 45528987 ERROR: 'Error: [$location:nobase] $location in HTML5 mode requires a <base> tag to be present! http://errors.angularjs.org/1.3.5/$location/nobase at http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:63:12 at $LocationProvider.$get (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:11187:15) at Object.invoke (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4138:17) at $LocationProvider.origProvider.$get (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4024:43) at Object.invoke (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4138:17) at http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:3956:37 at getService (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4097:39) at Object.invoke (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4129:13) at http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:3956:37 at getService (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4097:39)' ERROR: 'Error: [$location:nobase] $location in HTML5 mode requires a <base> tag to be present! http://errors.angularjs.org/1.3.5/$location/nobase at http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:63:12 at $LocationProvider.$get (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:11187:15) at Object.invoke (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4138:17) at $LocationProvider.origProvider.$get (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4024:43) at Object.invoke (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4138:17) at http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:3956:37 at getService (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4097:39) at Object.invoke (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4129:13) at http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:3956:37 at getService (http://localhost:9876/base/vendor/assets/javascripts/angular/angular.js?3a16995fbea0062d6334adb9277e9776ca069fa1:4097:39)' Chrome 39.0.2171 (Mac OS X 10.9.5) Midway: Resource performs a GET request Failed Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. LOG: Scope{$id: 2,$$childTail: null,$$childHead: null,$$prevSibling: null,$$nextSibling: null,$$watchers: null,$parent: null,$$phase: null,$root: Scope{$id: 2,$root: Scope{$id: ...,$$childTail: ...,$$childHead: ...,$$prevSibling: ...,$$nextSibling: ...,$$watchers: ...,$parent: ...,$$phase: ...,$root: ...,$$destroyed: ...,$$listeners: ...,$$listenerCount: ...,$$isolateBindings: ...,$$asyncQueue: ...,$$postDigestQueue: ...,$$applyAsyncQueue: ...},$$destroyed: false,$$listeners: Object{},$$listenerCount: Object{},$$isolateBindings: null,$$asyncQueue: [],$$postDigestQueue: [],$$applyAsyncQueue: []},$$applyAsyncQueue: []} LOG: undefined LOG: '' LOG: Object{title: 'Foo',excerpt: 'foo bar qux'} Chrome 39.0.2171 (Mac OS X 10.9.5) amnResource compiles to an article Failed Expected '' to match /Foo/. Error: Expected '' to match /Foo/. at Object.<anonymous> (/Users/acobster/DropBox/amn/amn-0.5/spec/javascripts/unit/directives/resource_spec.js:27:35) Chrome 39.0.2171 (Mac OS X 10.9.5): Executed 3 of 3 (2 Failed) (5.078 secs / 5.074 secs)
您可以通过执行以下操作来禁用基本标记检查:
$locationProvider.html5Mode({ enabled: true,requireBase: false });