【发布时间】:2014-07-27 21:21:05
【问题描述】:
我正在研究Angular Phonecat tutorial,并将一些建议纳入Opinionated AngularJS Styleguide
但是,我很难理解为什么特定的 Karma 测试会失败。
我的申请代码是:
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 测试都通过。
预计到达时间
有人问过karma.conf.js中的files数组。设置如下:
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'
],
【问题讨论】:
-
在 angular-resource.js 文件的部分文件路径中有
karma.conf.js或类似文件吗? -
你不是说
angular-route.js吗? -
您能描述一下您在重新组织导致测试失败的应用程序代码时所做的更改吗?这可能是一个很好的线索......
-
是的,我想到了 angular-route,现在,请显示
app.js- 描述依赖关系的第一行 - 你有类似angular.module('youApplicationName', ['ngResource', 'ngRoute','ngSanitize'])的东西吗? -
您在我的应用程序代码中看到的是 app.js 中的内容。当前唯一的依赖是
ngRoute
标签: javascript angularjs unit-testing karma-runner