2014-03-05 49 views

回答

1

最简单的方法,我发现清洁测试之间的数据库是

DROP SCHEMA public CASCADE; 
CREATE SCHEMA public AUTHORIZATION my_test_user; 

一旦public模式属于测试用户,他能滴并在需要时重新创建架构。请注意,删除数据库公共架构中的所有内容。

1

我用database-cleaner package清理数据库之前每个it指令和db-migrate包运行测试数据库重置之前。

下面的设置。

添加以下devDependenciespackage.json

"devDependencies": { 
    "chai": "^3.5.0", 
    "database-cleaner": "^1.1.0", 
    "mocha": "^3.0.2", 
    "db-migrate": "^0.10.0-beta.15", 
    "db-migrate-pg": "^0.1.10", 
    ... 
} 

下面是项目结构:

. 
├── config 
│   ├── cleaner-config.js 
│   ├── db.js 
│   └── ... 
├── db 
│   ├── database.json 
│   └── migrations 
│    ├── ... 
│    └── sqls 
│     └── ... 
├── node_modules 
├── scripts 
│   └── test 
├── ... 
├── src 
│   ├── db.js 
│   ├── models 
│   └── ... 
└── test 
    ├── init.js 
    └── src 
     └── ... 

cleaner-config.js

module.exports = { 
    postgresql: { 
    skipTables: ['migrations'] 
    } 
}; 

用来获取数据库configuratio的config/db.js N:

// Prepare default DB config 
const defaultOptions = function(environment = 'development') { 
    const host = 'db'; 
    const port = 5432; 
    const user = process.env.POSTGRES_USER; 
    const password = process.env.POSTGRES_PASSWORD; 

    var conf = { 
    host: host, 
    port: port, 
    user: user, 
    password: password, 
    database: process.env.POSTGRES_DB, 
    max: 10, // max number of clients in the pool 
    idleTimeoutMillis: 30000 // Keeps idle connections open for a 30 seconds 
    }; 

    // Change the used database in test environment 
    if (environment === 'test') { 
    conf.database = require('../db/database.json').test.database; 
    } 

    return conf; 
}; 

// Return database configuration for all environments 
module.exports = { 
    development: defaultOptions(), 
    test: defaultOptions('test') 
}; 

src/db.js文件负责建立数据库连接:

const PgPool = require('pg-pool'); 

// create a config to configure both pooling behavior and client options 
const CONFIG = require('../config/db')[process.env.NODE_ENV || 'development']; 

// Initializes connection pool 
const pool = new PgPool(CONFIG); 

module.exports = function(callback) { 
    pool.on('error', function(error, client) { 
    // if an error is encountered by a client while it sits idle in the pool 
    // the pool itself will emit an error event with both the error and 
    // the client which emitted the original error 
    // this is a rare occurrence but can happen if there is a network partition 
    // between your application and the database, the database restarts, etc. 
    // and so you might want to handle it and at least log it out 
    console.error('idle client error', error.message, error.stack); 
    }); 

    // to run a query we can acquire a client from the pool, 
    // run a query on the client, and then return the client to the pool 
    pool.connect(function(error, client, done) { 
    if (error) 
     return console.error('error fetching client from pool', error); 

    callback(client, done); 
    }); 
}; 

test数据库在database.json硬编码(也使用):

{ 
    "test": { 
    "driver": "pg", 
    "user": { 
     "ENV": "POSTGRES_USER" 
    }, 
    "password": { 
     "ENV": "POSTGRES_PASSWORD" 
    }, 
    "host": "db", 
    "database": "<prefix>_test" 
    }, 
    "development": { 
    "driver": "pg", 
    "user": { 
     "ENV": "POSTGRES_USER" 
    }, 
    "password": { 
     "ENV": "POSTGRES_PASSWORD" 
    }, 
    "host": "db", 
    "database": { 
     "ENV": "POSTGRES_DB" 
    } 
    }, 
    "sql-file": true 
} 

予加载我在test/init.js文件末尾的所有测试:

DB = { 
    client: null, 
    closeConnection: null 
} 

beforeEach(function(done) { 
    require('../src/db')(function(client, dbDone) { 
    DB.client = client; 
    DB.closeConnection = dbDone; 

    var DatabaseCleaner = require('database-cleaner'); 
    var databaseCleaner = new DatabaseCleaner('postgresql'); 

    databaseCleaner.clean(client, done); 
    }); 
}); 

// TODO: close connection only once - at the end of testing 
afterEach(function(done) { 
    DB.client = null; 
    DB.closeConnection(); 
    done(); 
}); 

require('./src/<some library>.test'); 
... 

最后但并非最不重要用于运行测试脚本scripts/test

#!/bin/bash 

script_directory="$(cd "$(dirname "$0")" && pwd)" 
project_directory=$script_directory/.. 

# Stop execution and exit on any error 
set -e 

cd $project_directory 

db_name='<prefix>_test' 

# Drop the DB 
# Use the development environment because of this issue: https://github.com/db-migrate/node-db-migrate/issues/393 
./node_modules/.bin/db-migrate --env development --migrations-dir db/migrations --config db/database.json db:drop $db_name 
# Create the DB 
# Use the development environment because of this issue: https://github.com/db-migrate/node-db-migrate/issues/393 
./node_modules/.bin/db-migrate --env development --migrations-dir db/migrations --config db/database.json db:create $db_name 

./node_modules/.bin/db-migrate --env test --migrations-dir db/migrations --config db/database.json up 

NODE_ENV=test ./node_modules/.bin/mocha test/init.js 
相关问题