3

我正在尝试在我的 karma 配置文件中包含一个简单的 html 文件,以访问我的 javascript 文件中的 html 元素,并在 karma 中使用 jasmine 对其进行测试。

但我总是得到一个Unexpected token <错误。我在网络广播中看到可以包含 html 文件,但我不知道为什么它不适用于我的配置?

提前致谢

4

3 回答 3

1

通过业力配置,您必须注册要在测试中使用的每个文件。您可以通过files在配置中向阵列添加模式来做到这一点。

文件模式如下所示:

files: [
    {
        pattern: 'test/unit/*.js',
        watched: true, //watching file modifications for test autorun
        included: true, //included as <script src="..."> in the runner html file
        served: true //used by tests (the test server should serve it)
    }
]

您可以使用短模式语法:

files: [
    'test/unit/*.js'
]

这意味着与之前的模式完全相同。

如果您不想在包含 as 的测试中使用您的文件<script src="file.js"></script>,那么您可以included: false通过 AJAX 从测试中使用和加载该文件。请注意,您应该为此使用相对 url,因为测试服务器的域总是可以更改...

模式顺序也很重要,它使用反向覆盖:

files: [
     {pattern: '*.js', included: true}
     {pattern: '*.js', included: false}
]

在这种情况下,每个 js 文件都将被包含在内,因此第一个模式会覆盖第二个模式。

例如通过 html 文件:

业力配置:

files: [
     {pattern: 'bootstrap.js', included: true}
     {pattern: 'x.html', included: false}
]

bootstrap.js:

var xhr = new XMLHttpRequest();
xhr.open('get', '/base/x.html', false);
xhr.send();
console.log(xhr.status, xhr.responseText); //200, '<html content>'

URI 总是有/base前缀,因为 Karma 将自己的index.html文件和 js 文件存储在顶层,因此它需要一个子文件夹。如果您想了解提供了哪些 URI,可以使用以下代码:

var servedUris = Object.keys(window.__karma__.files);

我写了一些基本fs的东西来支持 Yadda 读取的同步:https ://github.com/acuminous/yadda/blob/master/lib/shims/karma-fs.js你也许可以将它移动到不同的项目扩展它, 并在浏览器中使用fs而不是 AJAX。至少这就是我使用 Browserify 的方式。

于 2014-01-17T08:58:38.093 回答
0

我最终lib/middleware/karma.js在我的 Karma 安装中为该文件制作了一个简单的补丁。它使用扩展名.literal来表示“只是将整个文件回显到页面上”。我一直觉得奇怪的是,Karma 没有内置的方法来做到这一点。我的方式当然不是精心构建的,但它可能对你来说已经足够好了。

有了这个,你可以在你的 karma.conf.js 中拥有:

// ...
files: [
   "path/to/my_html.literal", // Echoed directly onto the page
   "path/to/other.js",        // Normal behaviour
   // ...
],

我的嵌套scriptTags函数(内部createKarmaMiddleware)看起来像这样:

var scriptTags = files.included.map(function(file) {
  var filePath = file.path;
  var fileExt = path.extname(filePath);

  // Include .literal files directly into the body of the HTML.
  if (filePath.match(/.literal$/)) {
     var fs = require("fs");
     return fs.readFileSync(filePath, "utf-8");
  }

  // ...

差异在这里:https ://github.com/amagee/karma/commit/c09346a71fc27c94cc212a2bd88b23def19ec3a4

于 2014-02-05T06:38:54.393 回答
-1

您需要使用html2js 预处理器(如果使用 AngularJS ,则需要使用ng-html2js预处理器)。请参阅预处理器描述以了解其工作原理。

从 Karma 0.10 开始,html2js 预处理器随 Karma 一起提供并默认配置:

module.exports = function(config) {
  config.set({
    files: [
      'templates/*.html'
    ],
    preprocessors: {
      '**/*.html': ['html2js']
    }
  });
};

然后您可以将 html 内容作为 JS 字符串访问:

var elm = $(__html__['templates/x.html'])

您收到的错误意味着 HTML 文件未经过预处理。默认情况下,所有 HTML 文件basePath都经过预处理,因此您的 HTML 文件可能位于其他位置,在这种情况下,您需要将它们preprocessors显式放入配置中。karma.conf.js如果您需要更多帮助,请分享您的。

于 2013-09-23T18:47:32.837 回答