2015-08-15 39 views
2

我有客戶端JavaScript,不以任何方式與DOM或網頁瀏覽器交互。我想在Travis-CI中單元測試這段代碼的功能(這只是一個奇特的數據庫/緩衝區),而無需啓動Web瀏覽器。命令行JavaScript讓我覺得我需要node.js。我瀏覽了各種單元測試庫,然後決定使用Mocha的簡單性,但是基於node.js的庫測試基於瀏覽器的模塊/類似乎過於困難。單元測試網頁瀏覽器無關的JavaScript

具體來說,我要測試的這款(簡體)瀏覽器的JavaScript有效的代碼:

// I need this NameSpace to organise my code and isolate from other code 
var Nengo = {}; 

Nengo.DataStore = function(dims) { 
    this.times = []; 
    this.data = []; 
    for (var i=0; i < dims; i++) { 
     this.data.push([]); 
    } 
} 

Nengo.DataStore.prototype.push = function(row) { 
    this.times.push(row[0]); 
    for(var i = 0; i < this.data.length; i++){ 
     this.data[i].push(row[i+1]); 
    } 
} 

當我嘗試在Node.js的測試,我不能正確導入Nengo命名空間的想法。這個測試甚至不能運行:

// get the datastore code from the folder below 
require("../simple_data") 
var assert = require("assert") 

describe("DataStore", function() { 
    var data_store = new Nengo.DataStore(2); 

    it("accepts data", function() { 
     data_store.push([0.0, 1.1, 1.2]) 
     assert.deepEqual(data_store.data, [[1.1], [1.2]]) 
    }); 
}); 

它失敗,出現以下錯誤:我曾經想過解決這一被放棄節點和輸出測試結果的DOM的

/home/saubin/javascript_test/test/simple_test.js:5 
    var data_store = new Nengo.DataStore(2); 
        ^
ReferenceError: Nengo is not defined 
    at Suite.<anonymous> (/home/saubin/javascript_test/test/simple_test.js:5:22) 
    at context.describe.context.context (/usr/local/lib/node_modules/mocha/lib/interfaces/bdd.js:49:10) 
    at Object.<anonymous> (/home/saubin/javascript_test/test/simple_test.js:4:1) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Module.require (module.js:364:17) 
    at require (module.js:380:17) 
    at /usr/local/lib/node_modules/mocha/lib/mocha.js:192:27 
    at Array.forEach (native) 
    at Mocha.loadFiles (/usr/local/lib/node_modules/mocha/lib/mocha.js:189:14) 
    at Mocha.run (/usr/local/lib/node_modules/mocha/lib/mocha.js:422:31) 
    at Object.<anonymous> (/usr/local/lib/node_modules/mocha/bin/_mocha:398:16) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:935:3 

的一種方式無頭瀏覽器和獲得結果,但這似乎是一個很大的開銷。我可以更改我的代碼的結構以與Node.js兼容嗎?由於缺乏對該領域的瞭解,是否還有其他解決方案?

+0

Nengo是否作爲節點模塊存在?你如何加載它? –

+0

它不是一個節點模塊,因爲它只在客戶端瀏覽器中運行,並且從我所瞭解的它是一個實際的節點模塊,我將不得不在服務器端運行它。我按照上面的代碼所示加載它,主要是因爲我不知道如何加載它。 – Seanny123

+0

@DaveNewton在我的最後一條評論中忘記提及你 – Seanny123

回答

1

你可以讓你的代碼「Node.js的感知」,所以它把全局定義爲實際的全球範圍內的同時仍保持與瀏覽器環境完全兼容:

if (typeof window !== "undefined") { 
    // in browser, define global to be an alias for window 
    // so global can be used to refer to the global namespace in 
    // both the browser and node.js 
    var global = window; 
} 

global.Nengo = {}; 

(function() { 
    var Nengo = global.Nengo; 

    Nengo.DataStore = function(dims) { 
     this.times = []; 
     this.data = []; 
     for (var i=0; i < dims; i++) { 
      this.data.push([]); 
     } 
    } 

    Nengo.DataStore.prototype.push = function(row) { 
     this.times.push(row[0]); 
     this.data.push(row.slice(1)); 
    } 
})(); 

然後,只需記住,任何全球定義必須明確分配給global命名空間。在node.js中,這會將它們分配給node.js中的實際global命名空間。在瀏覽器中,這會將它們分配給window對象,該對象是瀏覽器中的全局名稱空間。

+0

你給我的代碼添加了一個閉包的任何特定原因? – Seanny123

+1

@ Seanny123 - 只需保存一些輸入信息,我就可以定義一個名爲'Nengo'的本地變量,可以像以前一樣使用它。如果要爲每個方法定義輸入'global.Nengo.Datastore = function(){...}',則不需要閉包。 – jfriend00

0

雖然@ jfrien00的答案在技術上是正確的,但後來我想出了另一個答案。

首先,我需要重構我的JavaScript代碼以聲明DataStore文件之外的我的名稱空間。然後我聲明Nengo全局變量,因爲jfriend00描述了global.Nengo = {};,但僅限於我的Mocha測試文件。

這樣,當我在我的網絡瀏覽器中運行並且我的單元測試時,我的代碼已按預期進行了測試。

相關問題