Ich konnte den Test mit dem folgenden Code machen, aber es scheint komisch zu sein und ich verstehe es nicht völlig.Warum benötigt dieses RSpec Beispiel "Let!" statt "lassen"?
Kann mir jemand sagen, ob das Erstellen der Objekte auf diese Weise optimal ist?
Warum muss ich nur let!
für die 2. post_comment_reply
Erstellung verwenden und warum nicht ich für den Rest der Objekte?
post_comment.rb
belongs_to :post, touch: true
belongs_to :user
has_many :post_comment_replies, dependent: :destroy
has_many :users, through: :post_comment_replies
def send_post_comment_reply_creation_notification(reply)
post_repliers = ([user] + [post.user] + users).uniq - [ reply.user ]
post_repliers.each do |replier|
Notification.create(recipient_id: replier.id, sender_id: reply.user_id, notifiable: self.post, action: "commented")
end
end
post_comment_spec.rb
describe "instance methods" do
let(:post_user) { create(:user) }
let(:comment_user) { create(:user) }
let(:reply_user) { create(:user) }
let(:reply_user_2) { create(:user) }
let(:post_reader) { create(:user) }
let(:post) { create(:post, user: post_user) }
let(:post_comment) { create(:post_comment, user: comment_user) }
let(:post_comment_reply) { create(:post_comment_reply, post_comment: post_comment, user: reply_user) }
let!(:post_comment_reply_2) { create(:post_comment_reply, post_comment: post_comment, user: reply_user_2) }
it "send_post_comment_reply_creation_notification" do
expect{
post_comment.send_post_comment_reply_creation_notification(post_comment_reply)
}.to change{Notification.count}.by(3)
end
end
Etwas Unerklärliches passiert hier. 'let!' erzeugt 'post_comment_reply_2', bevor der' it' Block ausgeführt wird. Wie beeinflusst es die Erwartung? Wie schlägt der Test fehl, wenn Sie 'post_comment_reply_2' löschen? –
Zählen ändert sich um 2 anstelle der erwarteten 3. –
Es macht keinen Sinn, dass die Erstellung von 'post_comment_reply_2' * vor * dem Test das Ergebnis beeinflussen würde. 'change' wird' Notification.count' am Anfang des 'it' Blocks betrachten, nachdem' post_comment_reply_2' erstellt wurde. Wie trägt 'post_comment_reply_2' zur Veränderung bei? –