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