2012-02-03 63 views
2

我想知道是否有人已经解决了我遇到的问题。RSpec + jasmine-node

我目前正在使用Rails和Nodejs进程拆分进程的项目。我使用RSpec进行基于Rails的测试,并为节点对应使用jasmine-node。

我的情况是,Rails和Node应用程序都访问同一个数据库。我的问题是,RSpec在设置TEST数据库时很麻烦,为它提供了一些值,并针对这些值运行测试,但jasmine-node没有这样的机制。

相反,我的茉莉花节点数据库相关测试没有机制来设置测试数据库,所以我的茉莉花节点测试依赖于我的开发数据库。对我来说这是错误的和不好的,因为这些测试是不可重复的。

目前我的茉莉花节点测试是在一个单独的目录中,并在Rails的RSpec spec文件夹之外(并通过jasmine-node命令行运行)。最近我了解到RSpec可以驱动茉莉花客户端JavaScript测试。是否存在类似的机制来驱动RPsec中的茉莉花节点测试?

有其他人遇到过这个问题吗?如果是这样,我非常希望听到你如何接近和解决这个问题。

提前感谢和感谢。

回答

1

我的解决方案是使用环境变量TEST来指定是否使用测试或开发数据库。这个使用Sequelize的例子与本地机器和Heroku上的测试和开发数据库一起工作。

var config = {} 

if (typeof (process.env.DATABASE_URL) != 'undefined') { 
    var url = require('url'); 

    var dbUrl; 

    if (process.env.TEST == 'true') { 
     dbUrl = url.parse(process.env.HEROKU_POSTGRESQL_NAVY_URL); 
    } 
    else { 
     dbUrl = url.parse(process.env.DATABASE_URL); 
    } 

    var authArr = dbUrl.auth.split(':'); 

    config.database = dbUrl.path.substring(1); 
    config.username = authArr[0]; 
    config.password = authArr[1]; 
    config.host = dbUrl.hostname; 
    config.port = dbUrl.port; 
    config.dialect = 'postgres'; 
    config.protocol = 'postgres'; 
    config.importBatchSize = 1000; 
} 
else { 
    if (process.env.TEST == 'true') { 
     console.log('DB: test'); 

     config.database = 'test'; 
     config.username = 'postgres'; 
     config.password = 'postgres'; 
     config.host = '127.0.0.1'; 
     config.port = 5432; 
     config.dialect = 'postgres'; 
     config.protocol = 'tcp'; 
     config.importBatchSize = 1000; 
    } 
    else { 
     console.log('DB: db'); 

     config.database = 'db'; 
     config.username = 'postgres'; 
     config.password = 'postgres'; 
     config.host = '127.0.0.1'; 
     config.port = 5432; 
     config.dialect = 'postgres'; 
     config.protocol = 'tcp'; 
     config.importBatchSize = 1000; 
    } 
} 

config.logging = false; 
//config.logging = console.log; 

module.exports = config; 

然后,访问该数据库中的每个茉莉节点测试做了require上含有下列引导代码的文件:

process.env['TEST'] = 'true'; // Use test database 
var config    = require('../config/config.js'); 
process.env['TEST'] = 'false'; // Stop using test database after this 

var sequelizeSingleton = require("../classes/model.js"); 
sequelizeSingleton.setup(path.normalize(__dirname + '/../models'), config.database, config.username, config.password, 
    { dialect: config.dialect, protocol: config.protocol, host: config.host, port: config.port, omitNull: true, logging: config.logging });