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

How to mock "document" object for testing in Meteor App?

本文关键字:App Meteor 测试 对象 何模拟 模拟 文档      更新时间:2023-09-26

我使用摩卡和chai来测试我的Meteor应用程序,并有一个使用文档对象的模块。测试在服务器上运行,这当然会触发"文档未定义"。模拟文档对象或用使用文档的模块执行测试的好方法是什么?

我试过jsdom, jsdomify等,我也试过按照Meteor指南的测试部分进行集成测试和完整应用测试,但我还是卡住了。

任何建议或使用类似jsdom与meteor包的例子将不胜感激。

编辑-添加示例

这里有一个非常小的例子,我正在尝试做什么。我已经砍掉了它,以便在没有添加PhaserJS的情况下触发错误。然而,由于它是一个使用PhaserJS的项目,需要pixi和p2,所以很难告诉pixi/p2/Phaser需要对文档做什么。

/测试/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);
        });
    });
}

/进口/docChanger.js

//simulates pixi
(function(){
    var docChanger = {};
    docChanger.canvas = document.createElement('canvas');
    return docChanger;
}).call(this);

/进口/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:柴

因为无论如何您只在客户端上运行测试(您应该这样做,没有理由在服务器上运行它们),您可以简单地在测试文件中有条件地要求有问题的组件:

if (Meteor.isClient) {
  var Game = require('/imports/game.js').Game;
  describe( ...

从Meteor 1.3.3开始,也支持嵌套导入语句(如if (Meteor.isClient) { import {Game} from '/imports/game.js'; ...),但我不鼓励这样做,因为这会导致eslint出现问题。

如果您真的真的需要在服务器端测试中运行使用document的代码,您可以在全局命名空间中创建它并像这样模拟它的方法:

if (Meteor.isServer) {
  GLOBAL.document = { createElement: () => {} };
}

这将允许调用document.createElement()而不会出现错误。我想不出这种情况会有用,因为使用document的代码无论如何都是在客户端上运行的,并且只在客户端上测试它应该是完全足够的。