2016-08-23 55 views
0

我正在使用mocha和chai來測試我的Meteor應用程序,並且有一個使用文檔對象的模塊。測試在服務器上運行,當然會觸發「文檔未定義」。什麼是嘲笑文檔對象或以其他方式使用該文檔的模塊執行測試的好方法?如何在Meteor App中模擬「文檔」對象進行測試?

我試過jsdom,jsdomify等,我也試過按照流星指南的測試部分進行集成測試和全應用測試,但我已經陷入困境。

任何建議或使用像流星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; 
    } 
} 

我使用流星1.4.1和使用下列程序包是:

  • practicalmeteor:摩卡

  • practicalmeteor:柴

+0

你能發表一些你如何使用'document'的示例代碼嗎?我認爲答案的類型取決於你是否修改它,訪問它的屬性或者調用它的函數以及代碼的客戶特定性。 – Waiski

+0

@Waiski感謝您的評論。我已經添加了一個小例子。由於我使用的PhaserJS/pixi/p2模塊中有許多代碼行,因此我不知道文檔的所有使用方式。但是上面的例子會以最基本的方式觸發錯誤。以下是我正在使用的模塊代碼的鏈接,pixi.js,p2.js和phaser.js:https://github.com/photonstorm/phaser/tree/master/build – mkimmet

回答

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的代碼無論如何都在客戶端上運行,並且它應該完全足以僅在客戶端上進行測試。

+0

謝謝@Waiski,這只是我需要做些什麼才能點擊,也能識別我犯過的一些錯誤。 – mkimmet

相關問題