【发布时间】:2016-04-18 12:14:43
【问题描述】:
我能够使用以下代码进行测试,但这似乎很奇怪,我并不完全理解。
谁能告诉我以这种方式创建对象是否最佳?
为什么我必须只使用let! 来创建第二个post_comment_reply 而我为什么不使用其余的对象?
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
【问题讨论】:
-
这里发生了一些无法解释的事情。
let!在it块运行之前创建post_comment_reply_2。它如何影响预期?如果删除post_comment_reply_2,测试如何失败? -
计数变化 2 而不是预期的 3。
-
在测试之前创建
post_comment_reply_2会影响其结果是没有意义的。change将在it块的开头查看Notification.count,在创建post_comment_reply_2之后。post_comment_reply_2对改变有何贡献? -
该方法将通知发送给所有回复给定
post_comment的用户。由于两个回复都属于同一个post_comment,我认为这是预期的结果。还是我弄错了? -
我只是不清楚对象关系。我现在明白了,所以我可以正确地写出我心中的答案。
标签: ruby-on-rails ruby rspec factory-bot