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

参考

Sinatraで環境変数(environment)のセット - Qiita

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.