📘

【RSpec】modelのテストで実際にレコードが生成されない

2022/03/21に公開

テストコード

spec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  it 'user作成' do
    user = User.new
    user.name = "test_user1"
    user.save
  end
end

これを実行してbin/rails sしてもレコードが表示されない。

原因

database.ymlの設定

bin/rails sだとdevelopmentのdbを見るようになっている。
なので、
bin/rails s -e testとかにするとレコードが見られる。

database.yml
# SQLite. Versions 3.8.0 and up are supported.
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

rails_helperの設定

spec/rails_helper.rb
# 〜略〜
config.use_transactional_fixtures = true
# 〜略〜

でトランザクションのままで、テストで生成されるレコードがコミットされていない。

spec/rails_helper.rb
# 〜略〜
config.use_transactional_fixtures = false
# 〜略〜

とすると、
bin/rails s -e testでレコードが見られた。

参考記事

https://teratail.com/questions/1860

https://qiita.com/a_ishidaaa/items/b17ca8fa1a50ed5c3802

Discussion