我正在处理Angular Phonecat tutorial,并将Opinionated AngularJS Styleguide
中的一些建议纳入其中但是,我很难理解为什么特定的业力测试失败。
我的应用程序代码是:
function routeProvider(provider){ ... }
function phoneListCtrl(scope, http){ ... }
function phoneDetailCtrl(scope, http, routeParams){
http.get("/phones/" + routeParams.phoneId + ".json").success(function(data){
scope.phone = data;
});
}
angular.module("phonecatApp", ["ngRoute"])
.controller('PhoneListCtrl', ["$scope", "$http", function($scope, $http){
phoneListCtrl($scope, $http);
}])
.controller('PhoneDetailCtrl', ['$scope', '$routeParams', '$http', function($scope, $routeParams, $http){
phoneDetailCtrl($scope, $http, $routeParams);
}])
.config(['$routeProvider',function($routeProvider) {
routeProvider($routeProvider);
}]);
此应用程序代码适用于浏览器,其中电话列表和电话详细信息视图均按预期显示。控制台中未报告任何错误。
但是,由于
,PhoneDetailCtrl的此测试失败PhoneCat Controllers PhoneDetailCtrl should fetch phone detail FAILED
Error: [$injector:unpr] Unknown provider: $routeParamsProvider <- $routeParams
describe("PhoneDetailCtrl", function(){
var scope, $httpBackend, ctrl;
beforeEach(inject(function(_$httpBackend_, $rootScope, $routeParams, $controller){
$httpBackend = _$httpBackend_;
$httpBackend.expectGET("phones/xyz.json").respond({name : "phone xyz"});
$routeParams.phoneId = "xyz";
scope = $rootScope.$new();
ctrl = $controller("PhoneDetailCtrl", {$scope : scope});
}));
it("should fetch phone detail", function(){
expect(scope.phone).toBeUndefined();
$httpBackend.flush();
expect(scope.phone).toEqual({name : "phone xyz"});
});
});
具体来说,beforeEach(inject(function( ... ) { ... }));
会在转到angular-mocks.js
中的代码之前抛出错误。
为什么测试代码只有在重新组织应用程序代码后仍然失败,但仍可在浏览器中运行?这只发生在运行Karma测试时,所有Protractor测试都通过。
ETA
有些人询问了files
中的karma.conf.js
数组。设置为:
files : [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-route/angular-route.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/js/**/*.js',
'test/unit/**/*.js'
],
答案 0 :(得分:4)
我在完全相同的测试中有类似的错误。我发现问题在于模块是在一个内部describe
块内定义的。将模块创建语句移动到顶级describe
块可修复此错误。
这里有错误的代码:
'use strict';
describe('Controller: MainCtrl', function () {
describe('PhoneListCtrl', function() {
var scope, ctrl, $httpBackend;
beforeEach(module('phonecatApp'));
...
});
describe('PhoneDetailCtrl', function() {
var scope, $httpBackend, ctrl;
...
});
正确应该是:
'use strict';
describe('Controller: MainCtrl', function () {
beforeEach(module('phonecatApp'));
describe('PhoneListCtrl', function() {
var scope, ctrl, $httpBackend;
...
});
describe('PhoneDetailCtrl', function() {
var scope, $httpBackend, ctrl;
...
});
答案 1 :(得分:0)
看起来您缺少对bower_components/angular-route/angular-route.js
的引用
在karma.conf.js
中..检查此文件或您用于测试其具有角度路径DI的任何其他实体