2016-07-20 42 views
1

我已经设置了mocha在终端中运行测试。它适用于基本测试,如expect(1).to.equal(1)。我碰到的问题是我的脚本被包装在jQuery中,就像jQuery(function($) { // my code here });一样,并且在运行测试时出现错误。jQuery未定义使用摩卡来测试wordpress javascript

evalmachine.<anonymous>:15 
jQuery(function ($) { 
^ 

ReferenceError: jQuery is not defined 
at evalmachine.<anonymous>:15:1 
at Object.exports.runInThisContext (vm.js:54:17) 
at Suite.<anonymous> (/Users/grahamlutz/Documents/BBC/poolproof/test/test.js:21:8) 
at context.describe.context.context (/usr/local/lib/node_modules/mocha/lib/interfaces/bdd.js:47:10) 
at Object.<anonymous> (/Users/grahamlutz/Documents/BBC/poolproof/test/test.js:8:1) 
at Module._compile (module.js:413:34) 
at Object.Module._extensions..js (module.js:422:10) 
at Module.load (module.js:357:32) 
at Function.Module._load (module.js:314:12) 
at Module.require (module.js:367:17) 
at require (internal/module.js:16:19) 
at /usr/local/lib/node_modules/mocha/lib/mocha.js:220:27 
at Array.forEach (native) 
at Mocha.loadFiles (/usr/local/lib/node_modules/mocha/lib/mocha.js:217:14) 
at Mocha.run (/usr/local/lib/node_modules/mocha/lib/mocha.js:469:10) 
at Object.<anonymous> (/usr/local/lib/node_modules/mocha/bin/_mocha:404:18) 
at Module._compile (module.js:413:34) 
at Object.Module._extensions..js (module.js:422:10) 
at Module.load (module.js:357:32) 
at Function.Module._load (module.js:314:12) 
at Function.Module.runMain (module.js:447:10) 
at startup (node.js:141:18) 
at node.js:933:3 

我test.js如下:

var assert = require('assert'); 
var chai = require('chai'); 
var expect = chai.expect; 
var fs = require('fs'); 
var vm = require('vm'); 
var jsdom = require('mocha-jsdom'); 

describe('mocha tests', function() { 

jsdom(); 

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

var path = __dirname + '/../wp-content/themes/bb-theme-child/myscript.js'; 
var code = fs.readFileSync(path); 
vm.runInThisContext(code); 

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

我的问题是无论是为什么jQuery的不确定,或我做什么不正确的假设?我是否需要改变思考在wordpress设置中测试javascript的方式?

回答

0

你必须$jQuery出口到全球空间自己:

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

如果你读mocha-jsdom的文档,你会看到,它使得像windowdocument全局空间符号。当您加载jquery时,它会找到window并将其自身添加为window.$。在浏览器中,这个也是使$在全局空间中可见,因为window的全局空间。但是,在Node中,全局空间为global,因此您必须自行将$放入其中。

+0

感谢您的建议,但是这似乎没有解决这一问题。仍然得到相同的终端错误。 – BigBadBigBad

+0

我报道的问题肯定是问题的一部分。从可能在这里回答的人那里得到更精确的东西的最好方法是让你的问题变成[mcve]。 – Louis

3

以下两行代码适用于我。为了方便,我只是把这些放在我的摩卡测试文件的顶部。根据mocha-jsdom github自述文件的建议,我使用'jsdom-global'包而不是'mocha-jsdom'。 https://github.com/rstacruz/jsdom-global

this.jsdom = require('jsdom-global')() 
global.$ = global.jQuery = require('jquery'); 
+0

这对我来说很棒 - 欢呼! –