我正在使用mocha和chai来测试我的Meteor应用程序并拥有一个使用该文档对象的模块。测试在服务器上运行,当然会触发“文档未定义”。模拟文档对象或使用文档的模块执行测试的好方法是什么?
我已经尝试过jsdom,jsdomify等等。我也尝试过按照Meteor Guide的测试部分进行集成测试和全应用测试,但我已经陷入困境。
任何使用jsdom和meteor这样的软件包的建议或例子都会非常感激。
编辑 - 添加了一个示例
这是我正在尝试做的一个非常小的例子。我把它砍了下来,以便在没有添加PhaserJS的情况下触发错误。但是,由于这是一个使用PhaserJS的项目,需要使用pixi和p2,因此有必要告诉pixi / p2 / Phaser需要处理文档的所有内容。
/test/game.test.js
import { chai } from 'meteor/practicalmeteor:chai';
import {Game} from '/imports/game.js';
var assert = chai.assert;
if(Meteor.isClient){
describe('Game', function () {
it('can add 2 + 3 and return 5 with addNumbers function.', function () {
//arrange
var game = new Game();
//act
var result = game.addNumbers(2,3);
//assert
assert.equal(result, 5);
});
});
}
/imports/docChanger.js
//simulates pixi
(function(){
var docChanger = {};
docChanger.canvas = document.createElement('canvas');
return docChanger;
}).call(this);
/imports/game.js
import docChanger from '/imports/docChanger.js';
export class Game {
constructor(){
this.docChanger = docChanger;
}
addNumbers(x,y){
return x+y;
}
}
我正在使用Meteor 1.4.1并使用以下软件包:
practicalmeteor:摩卡
practicalmeteor:柴
答案 0 :(得分:1)
由于您只在客户端上运行测试(如您所愿,没有理由在服务器上运行它们),您只需在测试文件中有条件地需要有问题的组件:
if (Meteor.isClient) {
var Game = require('/imports/game.js').Game;
describe( ...
自Meteor 1.3.3以来,也支持嵌套的import语句(如if (Meteor.isClient) { import {Game} from '/imports/game.js'; ...
)但我不鼓励这样做,因为它会导致eslint出现问题。
如果你真的,真的需要在服务器端测试中运行使用document
的代码,你可以在全局命名空间中创建它并模拟它的方法:
if (Meteor.isServer) {
GLOBAL.document = { createElement: () => {} };
}
这样可以在没有错误的情况下调用document.createElement()
。我无法想到这会有用的情况,因为使用document
的代码无论如何都在客户端上运行,并且仅在客户端上测试它应该是完全足够的。