将变量传递给 Mocha 测试套件

Posted

技术标签:

【中文标题】将变量传递给 Mocha 测试套件【英文标题】:Passing variables down Mocha test suites 【发布时间】:2013-07-25 21:39:48 【问题描述】:

在使用 mocha 运行所有测试之前,我正在使用 mongoose 创建连接(并清理数据库)(_setup.js):

var mongoose = require('mongoose'),
nconf = require('nconf');

nconf.env().argv(); 

var _conn;

before(function(done)
    _conn = mongoose.createConnection(nconf.get('TEST_DB'), function(error)
      if(error) return done(error);

      _conn.db.dropDatabase(done);
   );
);

after(function(done)
   _conn.db.dropDatabase(function(error)
       if(error) return done(error);

       _conn.close(done);
   );
);

其他测试套件需要此连接来构建猫鼬模型。我使用单独的连接而不是默认的猫鼬连接,因为这些测试可以通过 mocha js api 在应用程序中运行。该应用程序使用默认的猫鼬连接。需要连接变量的示例测试:

var should = require('should'),
service = require('../lib/service')(_conn); // << somehow need that conn variable created in before tests

describe('Service', function()

   describe('#dodboperation()', function()

       //tests and stuff

无论如何在 mocha 中的文件/测试套件之间传递变量吗?有什么建议吗?

【问题讨论】:

【参考方案1】:

使用环境变量。在 mocha 文件的顶部,包括:

process.env.TEST = 'true'; // Use test database

然后,包括使用这样的数据库配置:

var url = require('url');
var config = ;
var dbUrl;

if (typeof(process.env.DATABASE_URL) !== 'undefined') 
    dbUrl = url.parse(process.env.DATABASE_URL);

else if (process.env.TEST === 'true') 
    dbUrl = url.parse('tcp://postgres:postgres@127.0.0.1:5432/test');

else 
    dbUrl = url.parse('tcp://postgres:postgres@127.0.0.1:5432/db');


config.dialect = 'postgres';
config.protocol = dbUrl.protocol.substr(0, dbUrl.protocol.length - 1); // Remove trailing ':'
config.username = dbUrl.auth.split(':')[0];
config.password = dbUrl.auth.split(':')[1];
config.host = dbUrl.hostname;
config.port = dbUrl.port;
config.database = dbUrl.path.substring(1);

console.log('Using database ' + config.database);
module.exports = config;

我们还在开发机器的不同端口上运行两个不同的服务器。我们在端口 4000 上运行 nodemon 以进行常规开发,然后如果 TEST == 'true' 则服务器在端口 4500 上运行。

【讨论】:

它适用于变量,我一直在寻找对对象做同样的事情,我们可以用作环境变量的任何东西似乎都将对象剥离为单行文本 环境变量只能保存字符串。您可以将对象编码为 JSON 并将其放入环境变量中,或者您可以将 JSON 存储在某个临时文件中。 但该对象将不是初始化的“相同”对象,我们将获得它的副本或其中的字段,例如,如果原始对象更改,我的 env json 不会.应该有替代方案。我将 mocha 与支持全局变量的sails 一起使用,所以我在sails 上搭载我的变量(使用sails.config.var),我正在寻找mocha 可以支持开箱即用的东西,例如当我不使用sails 之类的东西时。 终于找到了一个可以正常工作的解决方案,mocha支持全局变量,需要在命令行开关中提供它们,然后在任何地方访问。 (mocha --globals var1,var2...testfile.js)

以上是关于将变量传递给 Mocha 测试套件的主要内容,如果未能解决你的问题,请参考以下文章

在 gruntfile 中执行 shell 脚本并将结果分配给变量

Mocha:隐藏成功测试的 console.log 输出

流星测试:Mocha没有找到所有测试文件

在 Mocha 测试中使用 Superagent/Supertest 和 Express 应用程序

如何为 mocha 指定测试目录?

变量范围在 Mocha 测试框架中是如何工作的?