2015-08-15 59 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测试文件。

这样,当我在我的网络浏览器中运行并且我的单元测试时,我的代码已按预期进行了测试。

相关问题