はじめに

導入に手こずったので、RspecとFactory_botを導入する手順を記事に残そうと思います。基本的にはFactory_girlと同じ(だと思う....)

動作環境

  • macOS High Sierra

  • ruby, railsのバージョン

$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin17]

$ rails -v
Rails 5.1.4

Gemのインストール

以下のようにGemfileにRails用のrspecとfactory_botのgemを加えて、インストールを行います。

group :development, :test do
  gem 'rspec-rails'
  gem "factory_bot_rails"
end

rspecの設定

rspecの導入

まず、以下のコマンドでRailsアプリに、rspecを導入します。

$ bundle exec rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

rspecの生成ファイルの定義

application.rbのファイルに、以下コードを記述することで、railsコマンドでrspecファイルを生成する際に、不要なファイルを生成させないようにできます。

以下の例では、fixtureとcontrollerのファイルのみ、生成するという設定となっています。

/config/application.rb
config.generators do |g|
  g.test_framework :rspec,
    fixtures: true,
    view_specs: false,
    helper_specs: false,
    routing_specs: false,
    controller_specs: true,
    request_specs: false
  g.fixture_replacement :factory_bot, dir: "spec/factories"
end

Factory_botの設定

factory_bot.rbの作成

/support/factory_bot.rbを作成し、そこに以下のコードを記述します。

/support/factory_bot.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

上述のコードを加えることで、rspecのテストコード中でFactory_botのメソッドを使用する際に、名前空間の指定を省略できるようになります。

rails_helper.rbの設定

次に、/spec/rails_helper.rb内で以下の一文がコメントアウトされているので、コメントアウトを外してください。これで、先ほど設定したfactory_bot.rbが読み込まれるようになります。

/spec/rails_helper.rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

Factory_botを使って見る

テストデータの定義

例えばUserモデルに関しては、テストデータの定義は/spec/factories/users.rbに行います。以下は定義例です。データを生成する毎に通し番号をふってユニークな値を作るようにしています。

/spec/factories/users.rb
FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "TEST_NAME#{n}"}
    sequence(:email) { |n| "TEST#{n}@example.com"}
  end
end

Specテスト内でのテストデータの生成

使い方としては、以下のようにcreateか、buildでモデルを作成して、テストデータとして使うのが基本だと思います。

# DBへレコード生成
@user = create(:user)

# モデルのみの作成
@user = build(:user)

以下に、Userモデルのバリデーションをチェックするテストを書きました。参考になればどうぞ。

/app/models/users.rb
class User < ApplicationRecord
  validates :name, presence: true
  validates :email, presence: true
end
/spec/models/users.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  before do 
    @user = build(:user)
  end

  context 'バリデーション' do
    it 'nameとemailどちらも値が設定されていれば、OK' do
      expect(@user.valid?).to be_truthy
    end

    it 'nameが空だとNG' do
      @user.name = ''
      expect(@user.valid?).to be_falsey
    end

    it 'emailが空だとNG' do
      @user.email = ''
      expect(@user.valid?).to be_falsey
    end
  end
end

参考

factory_girlがfactory_botに名前変更!使用方法の解説など

Rails RSpecの基本 ~導入編~

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