1

私はこのようなアクションを持って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 ==)

非同期ワーカーが関与し、結果がそれらに依存する場合、そのようなケースをどのようにテストできますか?

4

2 に答える 2

2

コントローラーからメール配信を切り離したので、テストも切り離すことができます。このために私が過去に行ったことは、resque_spec Gemを使用して、ジョブが期待どおりにキューに入れられたかどうかのアサーションを追加できるようにすることです。

テストに次のようなものを追加します。

MailWorker.should have_queued(user.email)
于 2012-12-01T20:01:54.867 に答える
1

Rescue_spec gemを見てください。

于 2012-12-01T19:57:00.100 に答える