gpt4 book ai didi

ruby-on-rails - 为触发邮件程序的观察者编写规范

转载 作者:行者123 更新时间:2023-12-04 07:41:18 27 4
gpt4 key购买 nike

我正在编写一个简单的评论观察器,它会在创建新评论时触发邮件程序。所有相关代码都在这个要点中:https://gist.github.com/c3234352b3c4776ce132

请注意 Notification 的规范通过,但 CommentObserver 的规范失败,因为 Notification.new_comment 返回 nil。我发现我可以通过使用它来获得通过规范:

describe CommentObserver do
it "sends a notification mail after a new comment is created" do
Factory(:comment)
ActionMailer::Base.deliveries.should_not be_empty
end
end

然而,这并不理想,因为它在观察者的规范中测试邮件程序的行为,而我真正想知道的是它正确地触发了邮件程序。为什么邮件程序在原始版本的规范中返回 nil?指定此类功能的最佳方法是什么?我正在使用 Rails 3 和 RSpec 2(还有 Factory Girl,如果这很重要的话)。

最佳答案

上下文:

class CommentObserver < ActiveRecord::Observer
def after_create(comment)
Notification.new_comment(comment).deliver
end
end

# spec
require 'spec_helper'

describe CommentObserver do
it "sends a notification mail after a new comment is created" do
@comment = Factory.build(:comment)
Notification.should_receive(:new_comment).with(@comment)
@comment.save
end
end

在这种情况下,您要检查通知上是否调用了 deliver,所以这就是预期应该去的地方。规范代码的其余部分用于设置期望并触发它。试试这个方法:

describe CommentObserver do
it "sends a notification mail after a new comment is created" do
@comment = Factory.build(:comment)
notification = mock(Notification)
notification.should_receive(:deliver)
Notification.stub(:new_comment).with(@comment).and_return(notification)
@comment.save
end
end

Why is the mailer returning nil in the original version of the spec?

我相信这是因为消息期望就像 stub 一样——如果在 .and_return() 中没有指定值或通过传入一个 block ,should_receive 将返回 .

关于ruby-on-rails - 为触发邮件程序的观察者编写规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5020902/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com