PhantomJS不能很好地与RequireJS+Jasmine配合使用

PhantomJS not playing nice with RequireJS+Jasmine

本文关键字:RequireJS+Jasmine 不能 很好 PhantomJS      更新时间:2023-09-26

我有一些使用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>