ich bin mit dem testen und es ist nicht genau klar, wenn ich let
verwenden sollte.rspec modell spec lassen vs fabrik
Sollte ich let
im folgenden Modell Test für Lazy Loading verwenden oder da die Daten in jedem Test etwas anders sind, kann ich es so behalten wie es ist? Wie ich in einigen Beispielen gesehen habe, ist es viel wichtiger für Controller-Tests, da die :task
für jeden Aktionstest gleich sein würde.
Modell spec
require 'rails_helper'
RSpec.describe Task, type: :model do
describe "model validations" do
it "has a valid factory" do
expect(build(:task)).to be_valid
end
it "is invalid without executor" do
expect(build(:task, executor_id: nil)).not_to be_valid
end
it "is invalid without assigner" do
expect(build(:task, assigner_id: nil)).not_to be_valid
end
it "is invalid without content" do
expect(build(:task, content: nil)).not_to be_valid
end
it "is invalid without deadline" do
expect(build(:task, deadline: nil)).not_to be_valid
end
it "is invalid with deadline in the past" do
expect(build(:task, deadline: Faker::Time.between(DateTime.now - 1, DateTime.now - 2))).not_to be_valid
end
end
end
Fabriken
FactoryGirl.define do
factory :task do
content { Faker::Lorem.sentence }
deadline { Faker::Time.between(DateTime.now + 2, DateTime.now + 3) }
association :executor, factory: :user
association :assigner, factory: :user
end
end
Jim, können Sie auch kopieren Dieser Code mit der Fabrik, um genau den Unterschied zu sehen? –
@SzilardMagyar Fabriken erreichen ein ganz anderes Ziel. Die Aufgabe einer Factory besteht darin, Domänenobjekte bereitzustellen (und sie möglicherweise in der Datenbank zu belassen). Diese Strophe von Tests, die Sie oben schreiben, ist im Wesentlichen identisch mit denen, die ich für jedes aussagekräftige Modell in einer meiner Apps schreibe. Meine 'let'-Anweisungen enthalten häufig entweder Factory-Ausgaben selbst oder Domain-Methoden, die auf Objekten aufgerufen werden, die von einer Factory erstellt wurden. Ich hoffe, das hilft! –
Jim, zum Beispiel sehe ich nicht, dass Sie die 'task' von' let (: task) {create (: not_due_task)}} oder von 'let (: task) {create (: overdue_task)}} verwenden, also don ' t Ihr Beispiel wirklich bekommen. –