我使用了来自这里的angular translate (http://pascalprecht.github.io/angular-translate/),它运行良好,但它却破坏了我的控制器单元测试并出现错误:
Unexpected request: GET scripts/i18n/locale-en.json
我不明白为什么?
我使用yeoman和karma进行测试。
app.js:
'use strict';
(function() {
angular.module('wbApp', ['authService', 'authUserService', 'checkUserDirective', 'ui.bootstrap', 'pascalprecht.translate'])
.config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/login.html',
controller: 'LoginCtrl',
access: {
isFree: true
}
})
.when('/main', {
templateUrl: 'views/main.html',
controller: 'MainCtrl',
access: {
isFree: false
}
})
.otherwise({
redirectTo: '/'
});
});
})();
configTranslate.js:
'use strict';
(function() {
angular.module('wbApp')
.config(['$translateProvider',
function($translateProvider) {
$translateProvider.useStaticFilesLoader({
prefix: 'scripts/i18n/locale-',
suffix: '.json'
});
$translateProvider.preferredLanguage('en');
}]);
})();
karma.conf.js:
files = [
...
'app/bower_components/angular-translate/angular-translate.js',
'app/bower_components/angular-translate-loader-static-files/angular-translate-loader-static-files.js',
...
];
控制器测试:
'use strict';
describe('Controller: LoginCtrl', function() {
// load the controller's module
beforeEach(module('wbApp'));
var LoginCtrl, scope, location, httpMock, authUser;
// Initialize the controller and a mock scope
beforeEach(inject(function($controller, $rootScope, $location, $httpBackend, AuthUser) {
authUser = AuthUser;
location = $location;
httpMock = $httpBackend;
scope = $rootScope.$new();
LoginCtrl = $controller('LoginCtrl', {
$scope: scope
});
httpMock.when('GET', 'scripts/i18n/locale-en.json').passThrough();
}));
it(...);
...
});
如果我在测试控制器中添加这个,产品仍然会出现相同的错误:
httpMock.when('GET', 'scripts/i18n/locale-en.json').respond(200);
httpMock.flush();
或者
httpMock.when('GET', 'scripts/i18n/locale-en.json').passThrough();
httpMock.flush();
我发现这篇文章《如何测试在应用程序配置中初始化了Angular Translate的控制器?》,但没有帮助到我 :/
我在我的测试中广泛使用$httpBackend,它工作得很好,但在这种情况下却无效。如果我注释掉以下行:
$translateProvider.preferredLanguage('en');
很明显是个错误,如果我在运行时(在我的控制器中)添加的话。
$translate.uses(local);
我最终遇到了相同的错误?
所以我转向翻译配置(configTranslate.js),或在运行时得到相同的结果:
Unexpected request: GET scripts/i18n/locale-en.json
以下是我测试过的语法,可以在“beforeEach(inject(function(...)}”中使用,也可以在测试“it('...', function() {...});”中使用。
httpMock.expectGET('scripts/i18n/locale-en.json');
httpMock.when('GET', 'scripts/i18n/locale-en.json').passThrough();
httpMock.when('GET', 'scripts/i18n/locale-en.json').respond(data);
在结尾处使用“at”
httpMock.flush();
我也尝试了一个 $ apply。
httpMock.expectGET('scripts/i18n/locale-fr.json');
scope.$apply(function(){
$translate.uses('fr');
});
httpMock.flush();
什么也没有发生,但这个错误让我疯狂......
如果您有任何建议:
scripts/i18n/locale-en.json.
注意末尾的额外句点?这是一个打字错误还是真实的信息?因为您期望不带句点结尾的请求,所以它可能是问题的原因。 - jusio