如何在Meteor App中模拟“文档”对象进行测试?

时间:2016-08-23 21:56:38

标签: javascript testing meteor

我正在使用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:柴

1 个答案:

答案 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的代码无论如何都在客户端上运行,并且仅在客户端上测试它应该是完全足够的。