2011-03-15 2 views
2

Heroku에 최신 RoR 응용 프로그램을 배포하기 시작했습니다. 이전에 SQLite와 MySQL을 사용하고 있었기 때문에 PostgreSQL을 사용해야했습니다. 저는 개발의 열기 속에서 어떤 것도 깨뜨리지 않았 음을 확인하기 위해 3 개의 데이터베이스 모두에 대해 계속적으로 레드/그린 테스트를 수행하는 아주 간단하고 쉬운 방법을 원했습니다.RoR : 여러 데이터베이스에 대해 내 앱을 테스트하려면 어떻게해야합니까?

어떻게해야할까요?

+1

질문이 있습니까? –

+1

답변에 대한 질문입니다 (FAQ에 따르면 합법입니다). 나는 다른 사람들이 유용하다고 생각할지도 모른다고 생각했다. –

+1

아니, 질문 부분에 질문 + 답변. 아래에 자신의 질문에 답변하십시오 ("귀하의 답변") 그리고 그 대답을 수락하십시오. 이렇게하면 응답되지 않은 대기열에서 이동합니다. 감사! – awendt

답변

0

@awendt은 내 자신의 질문에 대답 할 수 있다고 친절하게 지적했다.

레시피가 다소 단순합니다. 비밀은 환경 변수를 사용하여 DB에 사용할 데이터베이스를 알려주는 것입니다.

test: 
<% if (ENV["RAILS_DB"] == "PostgreSQL") %> 
    adapter: postgresql 
    encoding: unicode 
    database: bd_test 
    pool: 5 
    username: <%= ENV['POSTGRESQL_USERNAME'] || 'root' %> 
    password: <%= ENV['POSTGRESQL_PASSWORD'] || '' %> 
<% elsif (ENV["RAILS_DB"] == "MySQL") %> 
    adapter: mysql 
    encoding: utf8 
    reconnect: false 
    database: bd_test 
    pool: 5 
    username: <%= ENV['MYSQL_USERNAME'] || 'root' %> 
    password: <%= ENV['MYSQL_PASSWORD'] || '' %> 
    socket: <%= ENV['MYSQL_SOCKET'] || '/tmp/mysql.sock' %> 
<% else %> 
    # default to SQLite 
    adapter: sqlite3 
    database: db/test.sqlite3 
    pool: 5 
    timeout: 5000 
<% end %> 

주 1 : 난 단지 테스트 환경을 표시했습니다

1. 수정 파일 config/database.yml에서

는 ERB는 다음과 같이 구성한다 포함한다. 사실, 그것은 제가 수정 한 유일한 것입니다. (아마도) 그것이 3 개의 데이터베이스가 모두 제대로 지원되는지 알려주는 충분한 범위를 제공하기 때문입니다.

참고 2 : 사용자 이름과 암호를 설정하기 위해 환경 변수를 사용할 필요가 없습니다. 일반적으로 보게되는 파일에 암호가 노출되는 것을 피하기 때문에 선호합니다. 다음과 같이

마찬가지로, Gemfile을 확장 (버전 번호가 다를 수 있습니다) :

source 'http://rubygems.org' 
gem 'rails', '3.0.3' 
case ENV["RAILS_DB"] 
when "PostgreSQL" 
    gem 'pg', '0.10.0' 
when "MySQL" 
    gem 'mysql2' 
else 
    gem 'sqlite3', '1.3.3' 
    gem 'sqlite3-ruby', '1.3.3', :require => 'sqlite3' 
end 
... 

2. 레일 개발 팀의 최선의 노력에도 불구하고 코드

에 조건을 추가,가 ActiveRecord 구조가 데이터베이스의 모든 유형에 대해 호환되지 않는 몇 개의 지점. 이 경우 ActiveRecord::Base.connection.adapter_name에 코드를 적용 할 수 있습니다. 여기에 내 마이그레이션 파일 중 하나의 예입니다 : 이제 RAILS_DB 환경 변수를 설정하여 데이터베이스를 간단하게 선택할 수 있습니다

file: migrate/20110129023453_create_cached_web_pages.rb

def self.up 
    create_table :cached_web_pages do |t| 
    t.string :key    
    if ActiveRecord::Base.connection.adapter_name == "PostgreSQL" 
     t.binary :value 
    else 
     t.binary :value, :limit => 16777215 
    end 
    end 
end 
... 

3. 실행 및 테스트,하지만 함정이있다 : Gemfile에서 적절한 데이터베이스 어댑터를 설정하려면 매번 bundle install을 실행해야합니다. 다행히도, 그것은 정확히 테스트 코드가하는 것입니다.

$ RAILS_DB=SQLite autotest 

$ RAILS_DB=PostgreSQL autotest 

지금 내 파일에서 멀리 해킹 할 수와 내가 같이 아무것도 파손 한 경우 자동 측정 조용히 저를 알려줍니다 : 그래서, 예를 들어, 나는 두 개의 창에서 RSpec에의 자동 측정을 실행할 수 있습니다 나는 따라 간다.

관련 문제