【问题标题】:Error running command line Mocha using jQuery使用 jQuery 运行命令行 Mocha 时出错
【发布时间】:2016-01-28 17:07:42
【问题描述】:

所以我有这个在文件中使用 jQuery 的函数

account.js:

function getSession() {
  var session = null;
  $.ajax({
    url: "/ajax/get_session",
    async: false
  }).done(function(data, textStatus, jqXHR){
    session = data;
  });
  return session;
}

我想在命令行上使用 Mocha 对其进行测试。为此我有另一个文件:

test-account.js:

var assert = require('assert');
var fs = require('fs');
var vm = require('vm');

// includes minified & uglified version, assuming mocha is run in repo root dir
var path = '../public/js/account.min.js';
var code = fs.readFileSync(path);
vm.runInThisContext(code);

describe('getSession', function() {
  it('should return the empty string because it fails', function () {
      assert.equal('', getSession());
  });
});

但是当我在命令行上运行mocha 时出现错误

1 次失败

1) getSession 应该返回空字符串,因为它失败了:

ReferenceError: $ 未定义

在 getSession (evalmachine.:1:34)

在上下文中。 (test/test-account.js:19:24)

我是 Mocha n00b,所以我不确定解决这个问题的正确方向。我尝试添加

var jqueryLocalPath = 'jquery.min.js';
var jqueryCode = fs.readFileSync(jqueryLocalPath);
vm.runInThisContext(jqueryCode);

describe 调用test-account.js 之前没有成功。然后我尝试通过 Node.js 运行 require

npm install jquery

并添加

var $ = require('jquery');

在运行mocha 之前到test-account.js 的顶部。这也不起作用,我得到了同样的错误。第二种方法的另一个缺点是运行更新版本的 jQuery (2.2.0),我想在 (1.11.3) 上进行测试。

我怎样才能使这个测试工作?

【问题讨论】:

  • 我有一个类似的问题,所以我无法为我们解决这个问题。如果出现相关问题,我可能会提供帮助。我读过 Node 默认不包含无头浏览器,这是使用 jQuery 所必需的,因为 jQuery 需要访问 DOM;因此,需要无头浏览器或类似的浏览器。 Jsdom 是测试 jQuery 代码的一种可能的解决方案,一旦 jQuery 被实际加载。
  • 你可以像这样安装jquery:npm install jquery@1.11.3 其余的,下面的答案很好

标签: jquery node.js mocha.js


【解决方案1】:

我相信答案是使用correct Node modules 进行测试。

var assert = require('assert');
var fs = require('fs');
var vm = require('vm');
var jsdom = require('mocha-jsdom'); // This is necessary for testing jQuery in Mocha

describe('mocha tests', function () {

    jsdom()

    before(function () {
        $ = require('jquery')
    });

    // includes minified & uglified version, assuming mocha is run in repo root dir
    var path = 'account.js';
    var code = fs.readFileSync(path);
    vm.runInThisContext(code);

    describe('getSession', function() {
        it('should return the empty string because it fails', function () {
            assert.equal('', getSession());
        });
    });
});

【讨论】:

  • 别忘了安装jsdom包
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
相关资源
最近更新 更多