Rspec-rails: 遅延したActionMailer配信のマッチャー

作成日 2017年07月22日  ·  3コメント  ·  ソース: rspec/rspec-rails

これが機能の提案/リクエストに適した場所であることを願っています。

どのActiveJobジョブがキューに入れられているか( have_enqueued_job )を確認するのに役立つ特定のマッチャーがありますが、ActionMailerには同様のものはありません。

いくつか調べてみましたが、これがメールが送信されたことをテストするために使用される一般的な方法のようです。 どの電子メールが送信されたかを説明

expect {
  post :create, params: { user: attributes_for(:user) }
}.to change(ActionMailer::Base.deliveries, :size).by(1)

より具体的で説明的な仕様を作成できるように、電子メール用の追加のマッチャーがあれば素晴らしいと思います。

expect {
    post :create, params: { user: attributes_for(:user) }
}.to have_enqueued_mailer(UserMailer, :welcome).with(User.first)

これに似た既存の機能を見逃していないことを願っています。よく見てきましたが、そのようなものは見つかりませんでした。

最も参考になるコメント

遅くなるよりはましですが、このカスタムマッチャーは多かれ少なかれトリックを行う必要があります。

RSpec::Matchers.define :have_enqueued_mailer do |mailer_klass, mailer_action|
  match do |actual|
    actual.call
    <strong i="6">@mailer_klass</strong>, <strong i="7">@mailer_action</strong>, _, *<strong i="8">@args</strong> = enqueued_jobs[0][:args]

    <strong i="9">@mailer_klass</strong> == mailer_klass.to_s &&
      <strong i="10">@mailer_action</strong> == mailer_action.to_s
  end

  chain :with do |*args|
    <strong i="11">@args</strong> == args
  end
  supports_block_expectations
end


全てのコメント3件

遅くなるよりはましですが、このカスタムマッチャーは多かれ少なかれトリックを行う必要があります。

RSpec::Matchers.define :have_enqueued_mailer do |mailer_klass, mailer_action|
  match do |actual|
    actual.call
    <strong i="6">@mailer_klass</strong>, <strong i="7">@mailer_action</strong>, _, *<strong i="8">@args</strong> = enqueued_jobs[0][:args]

    <strong i="9">@mailer_klass</strong> == mailer_klass.to_s &&
      <strong i="10">@mailer_action</strong> == mailer_action.to_s
  end

  chain :with do |*args|
    <strong i="11">@args</strong> == args
  end
  supports_block_expectations
end


この問題は#1901と重複していますか?

はい@ybiquitous! :)

マッチャーをありがとう@cgat

#1901の締めくくり

このページは役に立ちましたか?
0 / 5 - 0 評価