Docker-composeでSinatra + Nginx + MySQL を動かす時のハマりポイント - Qiita
sinatraで画像投稿サービスを作ってテストをしようとした時に、MySQLの接続先をテスト用とdokcer用で切り替えてテストする必要があったのでその時のメモ。
ActiveRecord使わない方法を見つけるのが難しかったので書いておきます!
簡単なディレクトリ構成
.
├── myapp.rb
├── test
│ └── test_myapp.rb
解決策
ENV['RACK_ENV']
を使いましょう。
testコードの冒頭でENV['RACK_ENV'] = "test"
を設定して、rubyのmysql接続部分で参照してhostを振り分ければOKです。
myapp.rb
- docker-composeを使う時
- ENV['RACK_ENV'] は nil
- testするとき
- ENV['RACK_ENV'] は test
- ローカルのmysqlで動かしたいとき
-
sudo RACK_ENV=development bundle exec ruby myapp.rb
というようにRACK_ENVを設定 - ENV['RACK_ENV'] は development
-
def db_connect()
if ENV['RACK_ENV'] == "test" || ENV['RACK_ENV'] == "development"
host = 'localhost'
else
host = 'db'
end
client = Mysql2::Client.new(
:host => host,
:port => '3306',
:username => 'root',
:password => '',
:database => 'latestgram',
:encoding => 'utf8mb4',
:datatbase_timezone => :local
)
return client
end
test_myapp.rb
ENV['RACK_ENV'] = 'test'
require_relative '../myapp'
require 'minitest/autorun'
require 'rack/test'
class MyAppTest < Minitest::Test
include Rack::Test::Methods
def app
MyApp
end
def test_my_default
get '/'
assert last_response.ok?
get '/signin'
assert last_response.ok?
get '/signup'
assert last_response.ok?
end
end