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
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.
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
.
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.
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.
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.
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?
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.