LoginSignup
4
0

More than 5 years have passed since last update.

【ruby】rack/testでdbを切り替えてtestする

Last updated at Posted at 2018-04-11

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

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0