RSpec + жасминовый узел - PullRequest
       15

RSpec + жасминовый узел

2 голосов
/ 03 февраля 2012

Мне было интересно, если кто-нибудь уже решил проблему, с которой я столкнулся.

В настоящее время я работаю над проектом с процессами, разделенными между Rails и процессом Nodejs.Я использую тестирование на основе RSpec для Rails и jasmine-node для аналога Node.

Моя ситуация такова, что приложения Rails и Node обращаются к одной и той же базе данных.Моя проблема в том, что RSpec делает это тривиальным в настройке базы данных TEST, заполнении ее некоторыми значениями и выполнении тестов против них, но у jasmine-node такого механизма нет.

Вместо этого в моих тестах, связанных с базой данных жасминового узла, нет механизма настройки базы данных TEST, поэтому вместо этого мои тесты жасминового узла полагаются на мою базу данных DEVELOPMENT.Для меня это и неправильно, и плохо, поскольку эти тесты не повторяются.

В настоящее время мои тесты jasmine-узла находятся в отдельном каталоге и вне папки спецификации RSpec Rails (и запускаются через командную строку jasmine-node).Недавно я узнал, что RSpec может выполнять тесты jasascript клиента jasmine.Существует ли подобный механизм для запуска тестов jasmine-узлов из RPsec?

Кто-нибудь еще сталкивался с этой проблемой?Если это так, я очень хочу услышать, как вы подошли к этой проблеме и решили ее.

Мои благодарности и благодарность заранее.

1 Ответ

1 голос
/ 03 апреля 2013

Мое решение состояло в том, чтобы использовать переменную среды TEST, чтобы указать, использовать ли тестовую базу данных или базу данных разработки.Этот пример, который использует Sequelize, работает с базами данных test и dev как на локальном компьютере, так и на 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 });
...