【问题标题】:Angular and Karma - Why does this test fail?Angular 和 Karma - 为什么这个测试会失败?
【发布时间】: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


【解决方案1】:

我在完全相同的测试中遇到了类似的错误。我发现问题在于模块是在内部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;
        ...
    });

【讨论】:

    【解决方案2】:

    您似乎缺少对 bower_components/angular-route/angular-route.js 的引用 在您的karma.conf.js .. 检查此文件或您用于测试它具有角度路由 DI 的任何其他实体

    【讨论】:

    • 查看我的编辑,我在karma.conf.js 中添加了文件数组。 angular-route.js 已包含在内。如果我将其注释掉,所有四个测试都会失败,而不仅仅是一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多