node.js - 在 Jasmine 2 中正确使用 karma-commonjs

标签 node.js jasmine phantomjs karma-runner karma-jasmine

我花了相当多的时间尝试调试它,并想我会问。我什至创建了一个 GitHub repository但不会依赖它,所以就这样吧。我正在尝试使用 PhantomJS 在 Karma 测试运行器中利用 CommonJS 语法。对于我的模块,我创建了我能想到的最简单的东西:

exports.returnYes = function() {
  return "Yes";
};

Jasmine 测试是:

var returnYes = require("../js/returnYes").returnYes;

describe("returnYes", function() {

  it("should return Yes", function() {
    expect(returnYes()).toBe("Yes");
  });

});

而且,如果我执行 jasmine init,我可以从命令行运行它,这要归功于 jasmine-npm,只需键入 jasmine输出:

$ jasmine
Started
.


1 spec, 0 failures
Finished in 0.003 seconds

现在尝试让它在 karma 中工作: 我创建了我的 karma.conf.js使用框架:jasminecommonjs。并且,我添加了 commonjs 作为预处理器。

我尝试执行karma run,但我发现它找不到global,它是jasmine.jsgetJasmineRequireObj 的一部分|它声明 jasmineGlobal = global;

命令行输出有点难以阅读,但这里是:

$ karma run
[2015-06-27 17:41:35.266] [DEBUG] config - Loading config /Users/zen/Projects/karma-commonjs-test/karma.conf.js
##teamcity[enteredTheMatrix]
##teamcity[testSuiteStarted nodeId='1' parentNodeId='0' name='karma.conf.js' nodeType='config' locationHint='config:///Users/zen/Projects/karma-commonjs-test/karma.conf.js']
##teamcity[testSuiteStarted nodeId='2' parentNodeId='1' name='PhantomJS 1.9.8 (Mac OS X 0.0.0)' nodeType='browser']
##teamcity[testStarted nodeId='3' parentNodeId='2' name='Error' nodeType='browserError']
##teamcity[testFailed nodeId='3' error='yes' message='ReferenceError: Can|'t find variable: global|nat http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?68f13ab3f93af5a219b9fe8409f8763b31998bba:27']
##teamcity[testSuiteFinished nodeId='2']
##teamcity[testSuiteFinished nodeId='1']

为了更好的衡量,我的 packages.json 中有 devDependencies:

"devDependencies": {
  "jasmine-core": "^2.3.4",
  "karma": "^0.12.37",
  "karma-commonjs": "0.0.13",
  "karma-jasmine": "^0.3.5",
  "karma-phantomjs-launcher": "^0.2.0",
  "phantomjs": "^1.9.17"
}

我不确定为什么找不到global。任何帮助将不胜感激!!! :)

最佳答案

似乎我的整个问题都归结为 karma.conf.js 中的那一行(我原来的问题中没有显示:

preprocessors: {
  '**/*.js': ['commonjs']
},

出于某种原因,jasmine.js 不喜欢被 commonjs 预处理,并且“**/*.js”表示要遍历所有子目录(这可能有点矫枉过正),包括具有 jasmine-core/jasmine.js 的 node_modules

所以我可以让我的预处理器更具体(最佳实践):

preprocessors: {
  'spec/*.js': ['commonjs'],
  'js/*.js': ['commonjs']
},

但为了测试是否有任何其他文件会给我带来问题,我尝试了:

preprocessors: {
  '**/!(jasmine).js': ['commonjs'],
},

而且,一切正常。底线。不要通过 commonjs 预处理器处理 jasmine.js!

关于node.js - 在 Jasmine 2 中正确使用 karma-commonjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31093961/

相关文章:

node.js - Node 7 : How to Show the Correct Stack Trace in Async Mongoose Promises

javascript - 服务前处理 Cookie

javascript - 带节点的 Phantomjs 给出 "Promise pending"

javascript - 使用 casperjs 通过 AJAX 发送 POST/PUT

python - 如何在 python webdriver 中为 phantomjs/ghostdriver 设置代理?

node.js - 是否有可能在 Github Codespaces 中更新 node.js?

node.js - 通过代码注释生成 API 文档

ajax - Jasmine 使用它来覆盖和测试使用 aiax 的方法

javascript - 用于检查 Angular Bootstrap 模态范围的 Jasmine 单元测试

unit-testing - Angular 2 - Jasmine 测试 - 在页面加载时打开模态