我在create
中有一个UsersController
行动,看起来像这样
def create
@user = User.new(params[:user])
if @user.save
sign_in_as(@user)
Resque.enqueue(MailWorker, @user.email)
redirect_to root_url, notice: "Thanks"
else
render "new"
end
end
在我将reqsue
添加到此操作之前,我一直在测试这样的电子邮件确认
it "creates a new user account" do
# code for creating a new account...
ActionMailer::Base.deliveries.size.should == 1
mail = ActionMailer::Base.deliveries.last
mail.to.should == [user[:email]]
mail.body.encoded.should match(/Thank you for registration/)
end
但是现在,因为我添加了resque worker来传递消息,我想它不会立即传递消息,因此我的测试失败并显示消息
Failure/Error: ActionMailer::Base.deliveries.size.should == 1
expected: 1
got: 0 (using ==)
如果涉及异步工作者且结果取决于它们,我如何测试此类情况?
答案 0 :(得分:2)
既然您已经从控制器中分离了邮件传递,那么您也可以将测试解耦。我过去为此做的是使用resque_spec Gem,它允许您添加关于作业是否按预期排队的断言。
您将在测试中添加以下内容:
MailWorker.should have_queued(user.email)
答案 1 :(得分:1)
看一下rescue_spec gem。