在另一个文件中包含文件

我正在尝试使用摩卡进行一些testing驱动开发。 在进入软件工程之初,我遇到了一个问题,包括test.js中的Graph.js:

项目/图表/ Graph.js:

function Graph(){ this.nodes = {}; this.id = 0; } Graph.prototype.newId = function(){ return this.id++; }; Graph.prototype.addNode = function(data){ var node = new Node(graph, this.newId()); node.data = data || {}; this.nodes[node.id] = node; return edge.id; }; Graph.prototype.removeNode = function(node){ for(var key in this.nodes){ for(var key2 in this.nodes[key].to){ if(this.nodes[key].edges.to[key2] == this){ delete this.nodes[key].edges.to[key2]; } } for(var key2 in this.nodes[key].from){ if(this.nodes[key].edges.from[key2] == this){ delete this.nodes[key].edges.from[key2]; } } } delete this.nodes[node.id]; return 0; }; Graph.prototype.addEdge = function(source, target){ id = this.newId(); source.edges.to[id] = target; target.edges.from[id] = source; return id; }; Graph.prototype.removeEdge = function(edgeId){ delete this.edges[edgeId]; }; function Node(graph, id){ this.id = id; this.graph = graph; this.edges = {}; this.edges.from = {}; this.edges.to = {}; }; exports.Graph = Graph; exports.Node = Node; 

项目/testing/ test.js:

 require('../Graph/Graph.js'); suite('Graph.js', function(){ setup(function(){ var graph = new Graph(); var n0 = graph.addNode({text: "Hello"}), n1 = graph.addNode({text: "Sweet"}), n2 = graph.addNode({text: "Worlds!"}); var e0 = graph.addEdge(n0, n1), e1 = graph.addEdge(n1, n2); }); test('traverse graph', function(){ var currentNode = n0; var str = '' while(Object.keys(currentNode.edges.to).length > 0){ str += currentNode.data.text + ' '; currentNode = currentNode.edges.to[Object.keys(currentNode.edges.to)[0]]; } assert.equals(str, 'Hello Sweet Worlds! '); }); }); 

用命令

 localhost:testing lowerkey$ mocha -u tdd -R nyan 

我得到以下结果:

  0 -__,------, 1 -__| /\_/\ 0 -_~|_( o .o) -_ "" "" ✖ 1 of 1 test failed: 1) Graph.js "before each" hook: ReferenceError: Graph is not defined at Context.<anonymous> (/Users/lowerkey/Desktop/TryThree/testing/test.js:5:19) at Hook.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:200:32) at next (/usr/local/lib/node_modules/mocha/lib/runner.js:201:10) at Runner.hook (/usr/local/lib/node_modules/mocha/lib/runner.js:212:5) at process.startup.processNextTick.process._tickCallback (node.js:244:9) 

更新随着var graphjs = require(...);var graph = new graphjs.Graph(); 我得到图(小写)没有定义。

您必须从exports获取Graphvariables

 var Graph = require('../Graph/Graph.js').Graph; ... var graph = new Graph(); 

我重组了这两个文件修复了几个错误:

这里是两个完整的文件:

Graph.js:

 function Graph(){ this.nodes = {}; this.id = 0; this.edges = {}; } Graph.prototype.newId = function(){ return this.id++; }; Graph.prototype.addNode = function(data){ var node = new Node(this, this.newId()); node.data = data || {}; this.nodes[node.id] = node; return node.id; }; Graph.prototype.removeNode = function(id){ for(var key in this.edges){ if(this.edges[key].source.id == id || this.edges[key].target.id == id){ delete this.edges[key]; } } delete this.nodes[id]; return 0; }; Graph.prototype.nodeIds = function(){ var ids = []; for(var key in this.nodes){ if(this.nodes[key] !== undefined){ ids.push(key); } } return ids; }; Graph.prototype.addEdge = function(sourceId, targetId){ var id = this.newId(); this.edges[id] = {target: sourceId, source: targetId}; return id; }; Graph.prototype.removeEdge = function(edgeId){ delete this.edges[edgeId]; }; Graph.prototype.edgeIds = function(){ var ids = []; for(var key in this.edges){ if(this.edges[key] != undefined){ ids.push(key); } } return ids; }; function Node(graph, id){ this.id = id; this.graph = graph; this.edges = {}; } Node.prototype.nodesFrom = function(){ var ids = []; for(var key in this.graph.edges){ if(this.graph.edges[key].source == this.id){ ids.push(this.graph.edges[key].target); } } return ids; }; Node.prototype.nodesTo = function(){ var ids = []; for(var key in this.graph.edges){ if(this.graph.edges[key].target == this.id){ ids.push(this.graph.edges[key].source); } } return ids; }; exports.tests = function(){ suite('Graph.js', function(){ function createGraph(){ var graph = new Graph(); var n0Id = graph.addNode({text: "Hello"}), n1Id = graph.addNode({text: "Sweet"}), n2Id = graph.addNode({text: "Worlds!"}); var e0Id = graph.addEdge(n0Id, n1Id), e1Id = graph.addEdge(n1Id, n2Id); return graph; } test('create graph', function(){ var graph = new Graph(); assert.isDefined(graph); }); test('removeNode', function(){ var graph = createGraph(); graph.removeNode(0); assert.deepEqual(graph.nodeIds(), ['1', '2']); }); test('removeEdge', function(){ var graph = createGraph(); graph.removeEdge(3); assert.deepEqual(graph.edgeIds(), ['4']); }); test('nodesFrom', function(){ var graph = createGraph(); assert.deepEqual(graph.nodes[1].nodesFrom(), [0]); }); test('nodesTo', function(){ var graph = createGraph(); assert.deepEqual(graph.nodes[1].nodesTo(), [2]); }) }); }; 

test.js:

 assert = require('chai').assert; require('../Graph/Graph.js').tests(); 

这样,testing将包含在每个源文件中,由项目testing套件运行。