[RUBY] [RSpec] Lassen Sie uns Factory Bot meistern

FactoryBot-Grundschlüssel

bin/rails g factory_bot:model user

Eine Datei, die Daten mit FactoryBot erstellt, wird wie in gezeigt. Dieses Mal denke ich, dass die folgende Datei in spec / factories / users.rb generiert wird.

spec/factories/users.rb


FactoryBot.define do
  factory :user do
  end
end

Ich werde die Daten, die ich erstellen möchte, in diese packen.

spec/factories/users.rb


FactoryBot.define do
  factory :user do
    name {"Sato"}
    age {20}
    height {170}
  end
end

Lass es uns tatsächlich benutzen.

spec/models/user.rb


require 'rails_helper'

RSpec.describe User, type: :model do
  it "is valid with a name, age and height" do
    expect(FactoryBot.build(:user)).to be_valid
  end
end

Sie können es so prägnant schreiben. Wenn Sie FactoryBot nicht verwenden, ist dies übrigens wie folgt.

spec/models/user.rb


require 'rails_helper'

RSpec.describe User, type: :model do
  it "is valid with a name, age and height" do
    user = User.new(
      name: "Sato",
      age: 20,
      height: 170,
    )
    expect(user).to be_valid
  end
end

Es wird so aussehen und die Anzahl der Zeilen wird zunehmen.

Obwohl das Lesen einfacher ist, wird der Inhalt der Daten im FactoryBot ausgeblendet. Wählen Sie daher je nach Anwendungsfall, ob Sie ihn verwenden möchten oder nicht.

überschreiben

Sie können die Daten in der Datei überschreiben, in der Sie die Spezifikationen schreiben.

spec/models/user.rb


require 'rails_helper'

RSpec.describe User, type: :model do
  it "is invalid without a name" do
    user = FactoryBot.build(:user, name: nil)
    user.vaild?
    expect(user.errors[:name]).to include("can't be blank")
  end
end

Überschreiben Sie den Inhalt von FactoryBot und ändern Sie name in nil.

Verwenden Sie Sequenzen, um eindeutige Daten zu erstellen

Zum Beispiel sollte "Met" ein eindeutiger Wert sein. Wenn Sie FactoryBot jedoch so verwenden, wie es ist, wird jedes Mal derselbe Wert eingegeben, sodass er bei der Validierung hängen bleibt. (Unbeabsichtigt.)

Eine "Sequenz" wird bereitgestellt, um dieses Problem zu beheben.

spec/factories/users.rb


FactoryBot.define do
  factory :user do
    name {"Sato"}
    age {20}
    height {170}
    #Eine Sequenz wird für E-Mails verwendet.
    sequence(:email) {|n| "test#{n}@example.com"}
  end
end

Auf diese Weise können Sie jedes Mal, wenn ein neuer Benutzer erstellt wird, einen eindeutigen Wert wie "test1 @ example.com", "test2 @ example.com" eingeben.

Machen Sie die Fabrik vielfältiger

Angenommen, Sie möchten eine ältere Person oder eine große Person testen. Sie können die kleinen Probleme in der Fabrik absorbieren. Es gibt zwei Hauptmethoden.

Vererbung verwenden

spec/factories/users.rb


FactoryBot.define do
  factory :user do
    name {"Sato"}
    age {20}
    height {170}
    sequence(:email) {|n| "test#{n}@example.com"}

    #Daten für ältere Menschen
    factory :senior do
      age {75}
    end
  
    #Daten für große Leute
    factory :tall do
      height {190}
    end
  end
end

Es kann wie "FactoryBot.build (: user,: senior)" oder "FactoryBot.build (: user,: tall)" verwendet werden.

Verwenden Sie die Eigenschaft.

Ich mag dieses besser. Der Grund ist, dass es verkürzt werden kann, indem man es in ** FactoryBot ** schreibt. ** Sie können sehen, was "anders" ist **. Lass uns trotzdem einen Blick darauf werfen!

spec/factories/users.rb


FactoryBot.define do
  factory :user do
    name {"Sato"}
    age {20}
    height {170}
    sequence(:email) {|n| "test#{n}@example.com"}

    
    trait :senior do
      age {75}
    end
  
    trait :tall do
      height {190}
    end
  end
end

Es kann durch Schreiben wie "FactoryBot.build (: user,: senior)" aufgerufen werden.

Auf diese Weise werden die ** Merkmale ** der Daten klar angezeigt, sodass sie gut lesbar sind, nicht wahr?

Rückrufen

FactoryBot kann auch dynamische Bewegungen ausdrücken. Siehe den Code unten.

spec/factories/users.rb


FactoryBot.define do
  factory :user do
    name {"Sato"}
    age {20}
    height {170}
    sequence(:email) {|n| "test#{n}@example.com"}

    trait :with_tasks do
      after(:create) { |user| create_list(:task, 5, user: user) }
    end
  end
end

Sie können Aufgaben in Bezug auf den Benutzer erstellen, indem Sie "FactoryBot.build (: user,: with_tasks)" ausführen.

Recommended Posts

[RSpec] Lassen Sie uns Factory Bot meistern
[RSpec] Verwenden wir FactoryBot [Rails]
[Schienen] Machen wir einen Unit-Test mit Rspec!