node.js - 使用 mocha 设置/拆卸 express.js 应用程序

标签 node.js makefile express zombie.js

我正在尝试使用 mocha 创建一个独立的测试套件,在完美的世界中,它将启动我的 express.js 应用程序,使用 zombie 来呈现页面,检查一堆东西,然后拆除/杀死 express。 .js 应用程序。

有没有简单/最好的方法来做到这一点?

注意。我可以在运行测试之前运行 express 应用程序服务器,但是如果你不打算刮牦牛,那有什么用呢。

最佳答案

首先,您需要将您的实际应用设置移动到一个模块中,并将其导入到实际启动您的应用的文件中。现在这是分开的,您可以在实际收听之前让应用程序处于完整状态。

你应该将你的应用程序的实际设置移动到一个单独的文件中,我们称之为 app.js,可以从你运行 Node 的文件中调用监听,我们称之为 index.js。

所以,app.js 看起来像:

    var express = require('express')
  , routes = require('./routes');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

app.get('/', routes.index);

index.js 看起来像:

var app = require('./app');

app.listen(3000, function(){
  console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
});

这将您的应用程序的加载与实际监听分开,允许您将该应用程序加载到您的单元测试中。

在你的单元测试中,你会在 setup 方法和 teardown 方法中做一些事情来启动和关闭服务器。

在文件 test/app_tests.js 中:

describe('app', function(){
  var app = require('../app');
  beforeEach(function(){
    app.listen(3000);
  });
  // tests here
  afterEach(function(){
    app.close();
  })
});

关于node.js - 使用 mocha 设置/拆卸 express.js 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965984/

相关文章:

javascript - 如何从express渲染html和javascript?

javascript - 免费的 Heroku 站点无法提供安全连接 : ERR_SSL_PROTOCOL_ERROR

javascript - ExpressJS 响应中间件

c - SDL makefile 缺少分隔符

javascript - Express - 在外部 JavaScript 文件中使用通过渲染函数接收的对象

javascript - PUT 请求发送错误后无法设置 header

node.js - 托管多个 Node JS 应用程序的 digital ocean ubuntu 14.04

node.js - 返回 POST 请求响应后运行方法

ubuntu - Caffe 运行测试报错

c++ - 生成错误 : base specifier must name a class