【초보자용】factory_bot을 이용한 더미 데이터의 작성 방법

6653 단어 RSpecRailsFactoryBot

factory_bot이란?



쉽게 더미의 인스턴스를 만들 수있는 젬입니다. 다른 파일에서 미리 각 클래스의 인스턴스에 정하는 프로퍼티를 설정해 두고, spec 파일로부터 메소드를 이용해 그대로의 인스턴스를 작성합니다.

도입 방법



Gemfile에 다음과 같이 기재

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

bundle install합니다.



spec 디렉토리 내에 'factories'라는 디렉토리를 만들고 (이번에는 user를 테스트하기 때문에) users.rb라는 파일을 만듭니다.

factory_bot을 사용하여 사용자 정의



방금 만든 factories/users.rb 안에 더미 사용자를 정의합니다.

factories/users.rb
FactoryBot.define do
  factory :user do
    name                  {"tanu"}
    email                 {"[email protected]"}
    password              {"11111111"}
    password_confirmation {"11111111"}
  end
end

정의한 사용자를 테스트 내에서 사용



앞서 정의한 user는 아래와 같이 사용합니다.

spec/model/user_spec.rb
describe User do
  describe '#create' do
    it 'is invalid without a name' do
      user = FactoryBot.build(:user, name: nil)
      user.valid?
      expect(user.errors[:name]).to include("を入力してください")
    end
  end
end

이것은 아래 내용과 함께입니다. (아래는 factory_bot을 사용하지 않고 동일한 내용을 기술한 예)
describe User do
  describe '#create' do
    it 'is invalid without a name' do
      user = User.new(name: "", email: "[email protected]", password: "11111111", password_confirmation: "11111111")
      user.valid?
      expect(user.errors[:name]).to include("を入力してください")
    end
  end
end

또한,
user = FactoryBot.build(:user, name: nil)
FactoryBot는 선택 사항이며 위는
user = build(:user, name: nil)

라고 쓸 수도 있습니다.

build 및 create 메서드



factory_bot의 메소드 중
  • build ... 인스턴스를 생성하는 메소드. new와 동일
  • create ... 데이터의 save까지를 실시한다. 그러나 save 된 데이터는 한 번의 테스트가 끝나면 사라집니다.

  • 라는 특징이 각각 있다고 합니다.

    리시버의 "FactoryBot"에 대한 설명 생략



    게다가 rails_helper에 아래와 같은 기술을 해 두는 것으로, "FactoryBot"라고 하는 기술은 생략할 수 있다고 합니다.

    spec/rails_helper.rb
    
    RSpec.configure do |config|
      #下記の記述を追加
      config.include FactoryBot::Syntax::Methods
      #省略
    end
    

    위의 설명을 통해 테스트 설명은 다음과 같이 생략 할 수 있습니다.
    user = build(:user, name: nil)
    

    테스트는 확실히 학습해 두도록(듯이) 주위로부터 여러가지 어드바이스를 받습니다만, 좀처럼 안쪽이 깊네요. 다시 접어보고 복습하고 싶습니다.

    좋은 웹페이지 즐겨찾기