无法在捆绑的aurelia应用程序的单元测试中使用帮助程序类。 RequireJS配置?

时间:2016-10-11 21:58:01

标签: requirejs aurelia aurelia-cli

摘要

使用aurelia cli和包含的默认任务,我无法在单元测试中利用位于test文件夹中的辅助类。

详情

从使用au new创建的示例应用程序开始,我有一个设计好的助手类位于' test / util / helper.ts':

export class Helper {
    Property : string;
}

此类由test / unit / app.spec.ts文件导入:

import {App} from '../../src/app';
import {Helper} from "../util/helper";

describe('the app', () => {
  it('says hello', () => {
    let h = new Helper();
    h.Property = "Testing";
    expect(h.Property).toBe("Testing");
    expect(new App().message).toBe('Hello World!');
  });
});

方法#1 - 捆绑 我在几个地方修改了aurelia.json文件:

  • 将typescript编译器的源代码更改为包含测试文件夹

    下的文件
    "transpiler": {
       "id": "typescript",
       "displayName": "TypeScript",
       "fileExtension": ".ts",
       "dtsSource": [
         "./typings/**/*.d.ts",
         "./custom_typings/**/*.d.ts"
       ],
       "source": ["src\\**\\*.ts","test\\**\\*.ts"]
    },
    
  • 修改应用包以排除测试文件夹中的任何文件

      {
        "name": "app-bundle.js",
        "source": {
          "include": [
            "[**/*.js]",
            "**/*.{css,html}"
          ],
          "exclude": [
            "**/test/**/*"
          ]
        }
      },
    
  • 添加一个新的包(test-util-bundle),其中包含来自test \ util文件夹的文件,并排除src和test / unit文件夹中的文件

    {
      "name": "test-util-bundle.js",
      "source": {
        "include": [
          "[**/*.js]"
        ],
        "exclude": [
          "**/src/**/*",
          "**/test/unit/**/*"
        ]
      }
    },
    

将应用程序与&#39; au build&#39;捆绑在一起后,我有三个捆绑包(app / vendor / test-util),test-util-bundle.js包定义了这样的帮助程序类:< / p>

define('../test/util/helper',["require", "exports"], function (require, exports) {
    "use strict";
    var Helper = (function () {
        function Helper() {
        }
        return Helper;
    }());
    exports.Helper = Helper;
});

我怀疑这是问题的根源,但不熟悉RequireJS。

当我跑步&#39; au test&#39;测试失败,出现以下错误:

11 10 2016 12:05:24.606:DEBUG [middleware:source-files]: Fetching C:/git/aurelia-cli-testing/test/test/util/helper
11 10 2016 12:05:24.608:WARN [web-server]: 404: /base/test/test/util/helper
Chrome 53.0.2785 (Windows 7 0.0.0) ERROR
Uncaught Error: Script error for "C:/git/aurelia-cli-testing/test/test/util/helper", needed by: C:/git/aurelia-cli-testing/test/util/helper
http://requirejs.org/docs/errors.html#scripterror
at C:/git/aurelia-cli-testing/scripts/vendor-bundle.js:3763

注意: 如果我在src树下移动helper.ts文件(完成here),这样可以正常工作。如果您希望查看该行为,则可以使用here

方法#2 - 没有捆绑实用程序类

  • 修改karma.conf.js
    let testSrc = [
      { pattern: project.unitTestRunner.source, included: false },
      { pattern: "test/util/**/*.ts", included: false },
      'test/aurelia-karma.js'
    ];

    ...

    preprocessors: {
      [project.unitTestRunner.source]: [project.transpiler.id],
      ["test/util/**/*.ts"]: [project.transpiler.id]
    },

通过此修改(没有实用程序类的捆绑),karma会产生以下错误:

18 10 2016 16:56:59.151:DEBUG [middleware:source-files]: Fetching C:/git/aurelia-cli-testing/test/util/helper
18 10 2016 16:56:59.152:WARN [web-server]: 404: /base/test/util/helper
Chrome 53.0.2785 (Windows 7 0.0.0) ERROR
  Uncaught Error: Script error for "C:/git/aurelia-cli-testing/test/util/helper", needed by: C:/git/aurelia-cli-testing/test/unit/app.spec.js
  http://requirejs.org/docs/errors.html#scripterror
  at C:/git/aurelia-cli-testing/scripts/vendor-bundle.js:3763

感谢阅读,非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

在Aurelia团队成员的帮助下,与aurelia cli一起分发的aurelia-karma.js文件的一个小修改解决了这个问题:

应修改normalizePath函数以在适用的地方追加'.js':

function normalizePath(path) {
  var normalized = []
  var parts = path
    .split('?')[0] // cut off GET params, used by noext requirejs plugin
    .split('/')

  for (var i = 0; i < parts.length; i++) {
    if (parts[i] === '.') {
      continue
    }

    if (parts[i] === '..' && normalized.length && normalized[normalized.length - 1] !== '..') {
      normalized.pop()
      continue
    }

    normalized.push(parts[i])
  }

  //Use case of testing source code. RequireJS doesn't add .js extension to files asked via sibling selector
  //If normalized path doesn't include some type of extension, add the .js to it
  if(normalized.length > 0 && normalized[normalized.length-1].indexOf('.') < 0){
    normalized[normalized.length-1] = normalized[normalized.length-1] + '.js';
  }

  return normalized.join('/')
}

答案 1 :(得分:2)

我必须做以下事情: 1.更新aurelia-project / aurelia.json文件。添加这个

  "unitTestRunnerUtils": {
"id": "karmaUtils",
"displayName": "Karma",
"source": "test\\utils\\**\\*.js"   },

然后在karma.conf.js文件中更新了这两个地方。

  

让testSrc = [{pattern:project.unitTestRunner.source,包括:   false},{pattern:project.unitTestRunnerUtils.source,包括:   false},&#39; test / aurelia-karma.js&#39; ];

  

预处理器:{         [project.unitTestRunner.source]:[project.transpiler.id],         [project.unitTestRunnerUtils.source]:[project.transpiler.id]       },

然后它起作用了......

以下是github上的示例项目。

https://github.com/duranmg/demo-aurelia-testing