gpt4 book ai didi

javascript - 使用 CommonJS 语法中的文件使用 Karma 和 RequireJS 进行测试

转载 作者:可可西里 更新时间:2023-11-01 01:25:00 25 4
gpt4 key购买 nike

我正在开发一个用 CommonJS 语法编写的 Angular 应用程序,并使用 grunt 任务和 grunt-contrib-requirejs 任务将源文件转换为 AMD 格式并将其编译成一个输出文件。我的目标是让 Karma 与 RequireJS 一起工作,并使我的源文件和规范文件保持 CommonJS 语法。

我已经能够通过具有以下文件结构的 AMD 格式的简单测试:

-- karma-test
|-- spec
| `-- exampleSpec.js
|-- src
| `-- example.js
|-- karma.conf.js
`-- test-main.js

和以下文件:

karma.conf.js

// base path, that will be used to resolve files and exclude
basePath = '';

// list of files / patterns to load in the browser
files = [
JASMINE,
JASMINE_ADAPTER,
REQUIRE,
REQUIRE_ADAPTER,
'test-main.js',
{pattern: 'src/*.js', included: false},
{pattern: 'spec/*.js', included: false}
];

// list of files to exclude
exclude = [];

// test results reporter to use
// possible values: 'dots', 'progress', 'junit'
reporters = ['progress'];

// web server port
port = 9876;

// cli runner port
runnerPort = 9100;

// enable / disable colors in the output (reporters and logs)
colors = true;

// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel = LOG_DEBUG;

// enable / disable watching file and executing tests whenever any file changes
autoWatch = true;

// Start these browsers, currently available:
browsers = ['Chrome'];

// If browser does not capture in given timeout [ms], kill it
captureTimeout = 60000;

// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun = false;

example.js

define('example', function() {
var message = "Hello!";

return {
message: message
};
});

exampleSpec.js

define(['example'], function(example) {
describe("Example", function() {
it("should have a message equal to 'Hello!'", function() {
expect(example.message).toBe('Hello!');
});
});
});

test-main.js

var tests = Object.keys(window.__karma__.files).filter(function (file) {
return /Spec\.js$/.test(file);
});

requirejs.config({
// Karma serves files from '/base'
baseUrl: '/base/src',

// Translate CommonJS to AMD
cjsTranslate: true,

// ask Require.js to load these files (all our tests)
deps: tests,

// start test run, once Require.js is done
callback: window.__karma__.start
});

但是,我的目标是用 CommonJS 语法编写源文件和规范文件并获得相同的结果,如下所示:

example.js

var message = "Hello!";

module.exports = {
message: message
};

exampleSpec.js

var example = require('example');

describe("Example", function() {
it("should have a message equal to 'Hello!'", function() {
expect(example.message).toBe('Hello!');
});
});

但是尽管将 cjsTranslate 标志设置为 true,我还是收到了这个错误:

Uncaught Error: Module name "example" has not been loaded yet for context: _. Use require([])
http://requirejs.org/docs/errors.html#notloaded
at http://localhost:9876/adapter/lib/require.js?1371450058000:1746

关于如何实现这一点有什么想法吗?


编辑:我在 karma-runner 仓库中发现了这个问题:https://github.com/karma-runner/karma/issues/552并且有一些评论可能有助于解决这个问题,但到目前为止我还没有遇到任何运气。

最佳答案

我最终找到的解决方案涉及使用 grunt并编写一些自定义的 grunt 任务。过程是这样的:

创建一个 grunt 任务来构建 Bootstrap requirejs 文件,方法是使用文件模式查找所有规范,遍历它们并构建传统的 AMD 风格的 require block ,并使用如下代码创建一个临时文件:

require(['spec/example1_spec.js'
,'spec/example2_spec.js',
,'spec/example3_spec.js'
],function(a1,a2){
// this space intentionally left blank
}, "", true);

创建一个 RequireJS grunt 任务来编译上述引导文件并输出一个 js 文件,该文件将有效地包含所有源代码、规范和库。

   requirejs: {
tests: {
options: {
baseUrl: './test',
paths: {}, // paths object for libraries
shim: {}, // shim object for non-AMD libraries
// I pulled in almond using npm
name: '../node_modules/almond/almond.min',
// This is the file we created above
include: 'tmp/require-tests',
// This is the output file that we will serve to karma
out: 'test/tmp/tests.js',
optimize: 'none',
// This translates commonjs syntax to AMD require blocks
cjsTranslate: true
}
}
}

创建一个手动启动 karma 服务器的 grunt 任务,并提供我们现在用于测试的单个已编译 js 文件。

此外,我能够在 karma.conf.js 文件中放弃 REQUIRE_ADAPTER,然后只包含单个编译的 js 文件,而不是匹配所有模式的模式源代码和规范,所以现在看起来像这样:

// base path, that will be used to resolve files and exclude
basePath = '';

// list of files / patterns to load in the browser
files = [
JASMINE,
JASMINE_ADAPTER,
REQUIRE,
'tmp/tests.js'
];

// list of files to exclude
exclude = [];

// test results reporter to use
// possible values: 'dots', 'progress', 'junit'
reporters = ['progress'];

// web server port
port = 9876;

// cli runner port
runnerPort = 9100;

// enable / disable colors in the output (reporters and logs)
colors = true;

// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel = LOG_INFO;

// enable / disable watching file and executing tests whenever any file changes
autoWatch = true;

// Start these browsers, currently available:
browsers = ['PhantomJS'];

// If browser does not capture in given timeout [ms], kill it
captureTimeout = 60000;

// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun = true;

在requirejs编译的grunt任务配置中,也需要使用almond为了开始测试执行(没有它测试执行会挂起)。您可以在上面的 requirejs grunt 任务配置中看到它的使用。

关于javascript - 使用 CommonJS 语法中的文件使用 Karma 和 RequireJS 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17281211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com