PhantomJS不能很好地与RequireJS+Jasmine配合使用
PhantomJS not playing nice with RequireJS+Jasmine
我有一些使用RequireJS和Jasmine运行的测试。我有一个 Jasmine 测试工具文件,如下所示:
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="./Scripts/jasmine/jasmine.css" />
<script type="text/javascript" src="./Scripts/jasmine/jasmine.js"></script>
<script type="text/javascript" src="./Scripts/jasmine/jasmine-html.js"></script>
<script type="text/javascript" src="./Scripts/jasmine/boot.js"></script>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js"></script>
<script type="text/javascript">
require(["fakeTest"], function () {
window.onload();
});
</script>
</head>
<body>
</body>
</html>
我的假测试文件非常简单:
define(["require", "exports"], function (require, exports) {
describe("fake test", function () {
it("test nothing", function () {
expect(1).toEqual(1);
});
});
});
如果我在火狐/铬上运行它,那么一切正常;我看到一个测试,它通过了。但是,如果我使用 PhantomJS 运行它,我开始遇到问题。使用远程调试器标志运行它,我收到错误:
错误:找不到模块"假测试"
需要
phantomjs://bootstrap.js:299 需要 phantomjs://bootstrap.js:263
如果我尝试更改我的线束文件,以便它显示requirejs[("假测试"......而不仅仅是要求,我收到此错误:
错误:"假测试"的脚本错误 http://requirejs.org/docs/errors.html#scripterror
https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:140 在默认错误
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:544 在错误中
https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1732 在脚本错误中:0在附录中
https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1952 加载
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1679 加载
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:829 加载
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:819 在获取
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:851 在检查
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1177 在启用
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1550 在启用
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1162 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:131 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:56
在每个 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1114 在启用
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:783 在初始化
中 https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js:1453
如果我输入一个完全无效的模块名称,在两种情况下都会得到相同的错误。
我完全不知道为什么会发生这种情况。我已经尝试更改了线束文件中 fakeTest 的路径,但没有任何变化。我已经尽可能地简化了线束文件,但由于我仍然看到这个,我不确定还有什么可以尝试的。有人有什么想法吗?
编辑
我已经删除了与茉莉花有关的所有内容,只是让 fakeTest 发出警报。现在我收到错误说
<html>
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.js"></script>
<script type="text/javascript">
require(["fakeTest"], function () {});
</script>
</head>
<body>
</body>
</html>
和
define(["require", "exports"], function (require, exports) {
alert('foo');
});
"引用错误:找不到变量:requirejs"
与其编写html
不如使用 karma 和 requirejs 插件。
业力.js
module.exports = function(config) {
config.set({
frameworks: ['jasmine', 'requirejs'],
files: [
{pattern: 'Scripts/**/*.js', included: false},
{pattern: 'test/*.js', included: false},
'test/test-main.js'
],
// list of files to exclude
exclude: [],
browsers: ['PhantomJS']
});
};
测试/测试主.js
var TEST_REGEXP = /(spec|test)'.js$/i;
var allTestFiles = [];
// Get a list of all the test files to include
Object.keys(window.__karma__.files).forEach(function(file) {
if (TEST_REGEXP.test(file)) {
// Normalize paths to RequireJS module names.
// If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
// then do not normalize the paths
var normalizedTestModule = file.replace(/^'/base'/|'.js$/g, '');
allTestFiles.push(normalizedTestModule);
}
});
require.config({
// Karma serves files under /base, which is the basePath from your config file
baseUrl: '/base',
// example of using a couple path translations (paths), to allow us to refer to different library dependencies, without using relative paths
paths: {
// Put Your requirejs config here
},
// example of using a shim, to load non AMD libraries (such as underscore)
shim: {
},
// dynamically load all test files
deps: allTestFiles,
// we have to kickoff jasmine, as it is asynchronous
callback: window.__karma__.start
});
这是示例文件。修复它并运行
karma run
而不是
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js"></script>
用
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js"
data-main="Tests/main"></script>
将测试文件移动到测试目录。
在 tests/main 中.js使用 requirejs 配置并运行 main tests 文件。
var deps = ['Tests/fakeTest'];
require.config({
baseUrl: '..',
paths: {
'jasmine': ['Scripts/jasmine//jasmine'],
'jasmine-html': ['Scripts/jasmine/jasmine-html'],
'jasmine-boot': ['Scripts/jasmine/boot']
},
// shim: makes external libraries compatible with requirejs (AMD)
shim: {
'jasmine-html': {
deps : ['jasmine']
},
'jasmine-boot': {
deps : ['jasmine', 'jasmine-html']
}
}
});
require(['jasmine-boot'], function () {
require(deps, function(){
//trigger Jasmine
window.onload();
})
});
在索引中.html仅运行 Tests/main.js 文件:
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="./Scripts/jasmine/jasmine.css" />
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js" data-main="Tests/main"></script>
</head>
<body>
</body>
</html>
- 以可优化的方式使用requirejs加载模板
- RequireJS向模块传递配置总是返回undefined
- PhoneGap/带有RequireJS's的文本插件
- 如何正确地将参数传递给RequireJS回调函数
- 在requirejs中共享实例化对象
- What does requirejs.config() do?
- 将javascript应用程序迁移到使用AMD的提示(例如requirejs)
- 为什么谷歌地图API's方法未从RequireJS中正确调用
- 创建一个可重用的RequireJs库
- angularjs、因果报应和requirejs测试用例错误
- 在RequireJS define函数中如何处理参数
- 如何为requirejs和qunit设置grunt任务
- 将broccoliJS与当前使用requireJS的模块化主干应用程序结合使用,我想完全放弃requireJS
- 使用requireJS的jqGrid-网格加载但不起作用
- requirejs定义:嵌套依赖关系
- Backbone+RequireJS+Mediator模式导致视图逻辑短路和无限循环
- 何时使用Requirejs以及何时使用捆绑的javascript
- 'define' 在 RequireJS 和 Webapp Yo 生成器上未定义错误
- Backbone+RequireJS:使集合持久化
- 有可能将SYSTEMJS与REQUIREJS结合起来吗