【问题标题】:How to mock "document" object for testing in Meteor App?如何模拟“文档”对象以在 Meteor App 中进行测试?
【发布时间】:2016-12-30 21:07:13
【问题描述】:

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

我已经尝试过 jsdom、jsdomify 等,我还尝试按照 Meteor Guide 的测试部分进行集成测试和全应用测试,但我卡住了。

非常感谢任何关于使用像 jsdom 这样的包和流星的建议或示例。

编辑 - 添加示例

这是我正在尝试做的一个非常小的示例。我已将其砍掉,以便在不添加 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 并且正在使用以下软件包:

  • 实用流星:摩卡

  • 实用流星:柴

【问题讨论】:

  • 你能发布一些你如何使用document的示例代码吗?我认为答案取决于你是否修改它、访问它的属性或调用它的函数以及代码是如何特定于客户端的。
  • @Waiski 感谢您的评论。我添加了一个小例子。我不知道使用文档的所有方式,因为我正在使用的 PhaserJS/pixi/p2 模块中有很多行代码。但是上面的例子会以最基本的方式触发错误。这是我正在使用的模块 pixi.js、p2.js 和 phaser.js 的代码链接:github.com/photonstorm/phaser/tree/master/build

标签: javascript testing meteor


【解决方案1】:

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

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

【讨论】:

  • 感谢@Waiski,这正是我需要让事情点击并认识到我所犯的一些错误。
猜你喜欢
  • 1970-01-01
  • 2013-02-07
  • 2015-08-30
  • 2019-08-22
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多