javascript - "Uncaught TypeError: Cannot read property ' ... ' of null"将 RequireJS 与 Karma 结合使用

标签 javascript unit-testing requirejs karma-runner

我正在尝试让 Jasmine 测试在 Karma 中运行。这是针对使用 RequireJS 的 AngularJS 应用程序,但目前,测试是一个简单的 expect(true).toBe(true); 测试没有 Angular 依赖项。我发现它在我禁用 Karma 的 requirejs 模块并注释掉 "client/app/require-shared.js""test/require 时运行-test.js"files 中并直接加载 testSpec.js 文件。

但是,只要我重新启用 requirejs 并将 RequireJS 配置文件添加回 karma.conf.js 的 files——将 testSpec.js 文件保留在那里要“静态”加载——我看到了错误

Chrome 33.0.1750 (Windows 7) ERROR
  Uncaught TypeError: Cannot read property 'failedCount' of null
  at C:/.../project/node_modules/karma-jasmine/lib/adapter.js:126
Chrome 33.0.1750 (Windows 7) ERROR
  Uncaught TypeError: Cannot read property 'length' of null
  at C:/.../project/node_modules/karma-jasmine/lib/jasmine.js:2518
Chrome 33.0.1750 (Windows 7): Executed 1 of 2 ERROR (0.009 secs / 0.001 secs)

如果我尝试完整的 Angular 测试,我会收到有关 $injector 为 null 的错误,但我认为这一切都源于此 requirejs 模块问题。我在设置中缺少什么才能使这项工作正常进行?

测试/karma.conf.js

module.exports = function(config) {

    config.set({
        basePath: "../", // resolves to "project/"

        frameworks: ["jasmine", "requirejs"],

        files: [
            // load the RequireJS config files first
            "client/app/require-shared.js",
            "test/require-test.js",

            // set included to false for files to be loaded via RequireJS
//          {pattern: "bower_components/**/*.js", included: false},
//          {pattern: "client/**/*.js",           included: false},
//          {pattern: "test/unit/*Spec.js",       included: false}
            {pattern: "test/unit/*Spec.js"}
        ],


        // list of files to exclude
        exclude: [
//          "client/app/app.js",
//          "client/app/bootstrap.js",
//          "client/app/require-main.js",
            "*.conf.js"
        ],

        reporters: ["progress"],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: false,
        browsers: ["Chrome"],
        singleRun: true
    });
};

client/app/require-shared.js

requirejs.config({
    paths: {
        "app":            "../app/app",
        "angular":        "../extlibs/angular-1.2.14",
        "jquery":         "../extlibs/jquery-2.1.0.min",
        "ng-cookies":     "../extlibs/AngularPlugins/angular-cookies-1.2.13",
        "ng-resource":    "../extlibs/AngularPlugins/angular-resource-1.2.13",
        "ng-route":       "../extlibs/AngularPlugins/angular-route-1.2.14",
    }

    ,shim: {
        angular: {
            exports: "angular"
        }
        ,"ng-resource": {
            deps: [ "angular" ],
            exports: "ng-resource"
        },
        ,"ng-cookies":     ["angular"]
        ,"ng-route":       ["angular"]
        ,"ngui-bootstrap": ["angular"]
    }
});

测试/require-test.js

var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

var pathToModule = function(path) {
    return path.replace(/^\/base\//, "").replace(/\.js$/, "");
};

Object.keys(window.__karma__.files).forEach(function(file) {
    if (TEST_REGEXP.test(file)) {
        // Normalize paths to RequireJS module names.
        var normalPath = pathToModule(file);
        console.log("adding " + file + " as " + normalPath + " to allTestFiles array");
        allTestFiles.push(normalPath);
    }
});

requirejs.config({
    baseUrl: "/base/client/components/"

    /*
     * "path" is defined in require-shared.js and shared with
     * require-main. Add paths for the testing files.
     */
    ,paths: {
        "test":          "../../test",
        "bower":         "../../bower_components",
        "angular-mocks": "bower/angular-mocks/angular-mocks"
    }

    ,shim: {
        'angular-mocks': {
            deps: [ 'ng-resource' ],
            exports: 'angular.mock'
        }
    }

    ,deps: allTestFiles
    ,callback: window.__karma__.start
});

测试/单元/testSpec.js

describe('a basic test of version', function() {
    it('true should be true', function() {
        expect(true).toBe(true);
    });
});

最佳答案

问题是 karma init 生成的 TEST_REGEXP 在文件名中寻找 spectest .这导致 require-test.js 文件被作为测试规范引入。

解决方案是其中之一

  • 重命名 require-test.js
  • 在 RE 中将 (spec|test) 更改为 spec
  • 将 RE 更改为 /^(?:(?!require-test\.js$).)*(spec|test)\.js$/i(另请参阅 this answer)

关于javascript - "Uncaught TypeError: Cannot read property ' ... ' of null"将 RequireJS 与 Karma 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22916628/

相关文章:

javascript - 如何使用包含所有菜单项的容器获得全宽下拉区域

javascript - 单击angular js中的链接加载html View 文件

c# - 数据访问层c#的单元测试

javascript - AngularJS的依赖注入(inject)和RequireJS本质上是一样的吗?

backbone.js - Backbone 关系与 Require.js (AMD)

javascript - Grunt requirejs 将 require 模块连接并压缩到一个文件中

javascript - 如何部分更新 DynamoDB 表?

javascript - TypeScript如何在数组的Reduce函数中设置累积值和初始值的类型

php - 如何使用 phpunit 为某些测试套件注入(inject)环境变量?

unit-testing - 为 Brunch with Coffee 编写和运行单元测试的最佳方式