WEB系プログラミングに関する雑記ブログ

このブログは、主にWEB系の話(プログラミング、IT系のニュースなど)をします。

Rspecにfactory_botとfakerを導入してみる

Rspecにfacroy_botとfakerを導入してみたので、

方法を残しておきます。

factory_botとは?

ダミーのインスタンスを作成できるgemのこと。

factoryを使ってインスタンスを定義しておけば、

テストをする際に、特定のメソッドを使って簡単にインスタンスが作成できます。

fakerとは?

ダミーのデータを自動生成してくれるgemのこと。

導入

では早速、factory_botとfakerを組み合わせて、

ダミーのインスタンスを作成し、テストを行います。

まずは、gemfileにgemを追加します。

gemfile


group :development, :test do
  #省略
  gem 'factory_bot_rails'
  gem 'faker'
end

そして、bundle installします。

次に、specディレクトリの下にfactoriesというフォルダを作成します。

そして、その中にusers.rbというファイルを作ります。

FactoryBot.define do
  pass = Faker::Internet.password(8)

  factory :user, class: User do
    name                  { Faker::Name.name }
    email                 { Faker::Internet.email }
    password              { pass }
    password_confirmation { pass }
  end
end

このように記述することで、 インスタンスを生成するたびに、 その都度ダミーのデータをランダムで作成してくれます。

実際にfacotry_botを使ってインスタンスを生成する時は、 下記のようなメソッドを使います。

#factory_botの記述をもとに作成

user = FactoryBot.build(:user)



#createの場合はテスト用のDBに値が保存される

user = FactoryBot.create(:user)

引数にシンボル型で取ったクラス名のインスタンスを、factory_botの記述をもとに作成します。 buildもcreateメソッドの両方ともインスタンスを生成しますが、

違いとしては、createはテスト用のDBに値が保存されるという点です。

ただし、テスト用のDBに値が保存されても、テストが終了すれば保存された値は消去されます。

また、設定を追加することで、「FactoryBot」の記述を省略することもできます。

rails_helperに以下の記述を追加します。

RSpec.configure do |config|
  #下記の記述を追加
  config.include FactoryBot::Syntax::Methods

  #省略

end

この設定を踏まえた上で、テストを書いてみます。



require 'rails_helper'

describe User do
  describe '#create' do

    it "is invalid without a nickname" do
      user = build(:user, name: "")
      user.valid?
      expect(user.errors[:nickname]).to include("can't be blank")
    end

  end
end

導入前の記述と比べてみると、このような形になります。


#導入前

require 'rails_helper'

describe User do
  describe '#create' do
    it "is invalid without a name" do
      user = User.new(name: "", email: "test@gmail.com", password: "123456", password_confirmation: "123456")
      user.valid?
      expect(user.errors[:nickname]).to include("can't be blank")
    end
  end
end

#導入後

require 'rails_helper'

describe User do
  describe '#create' do
    it "is invalid without a nickname" do
      user = build(:user, name: "")
      user.valid?
      expect(user.errors[:nickname]).to include("can't be blank")
    end
  end
end