1

ユーザーのメールをテストしたいだけなので、これがあります:

FactoryGirl.define do
  factory :user do |u|
      u.sequence(:email) {|n| "user#{n}@example.com" }
      u.first_name { Faker::Name.first_name }       
      u.password "foo123"
  end
end

アップデート

ご覧のとおり、メールを生成しているsequenceので、ユーザーの正しいメールアドレスを指しているかどうかをテストしたいと思います。例として、から正しいユーザーにメールを送信したいと思いますcontroller

let(:user) { FactoryGirl.create(:user) }

it "should notify user about his profile" do
   @user = FactoryGirl.create(:user)
   # profile update..
   ActionMailer::Base.deliveries.should include [@user.email]
end

上記のテストはuser.email、FactoryGirl によって作成されたものではなく、別の電子メール アドレスを指しているため失敗します。

1) UserController Manage users should notify user about his profile
     Failure/Error: ActionMailer::Base.deliveries.should include [user.email]
       expected [#<Mail::Message:5059500, Multipart: false, Headers: <From: foo <info@foo.com>>, <To: user16@example.com>, <Message-ID: <..41d@linux.mail>>, <Subject: foo>, <Content-Type: text/html>, <Content-Transfer-Encoding: 7bit>>] to include ["user15@example.com"]
       Diff:
       @@ -1,2 +1,2 @@
       -[["user15@example.com"]]
       +[#<Mail::Message:5059500, Multipart: false, Headers: <..>, <From: foo Verticals <info@castaclip.com>>, <To: user16@example.com>, <Message-ID: <..41d@linux.mail>>, <Subject: foo>, <Content-Type: text/html>, <Content-Transfer-Encoding: 7bit>>]

助けはありますか?tnx。

4

1 に答える 1

0

に含まれてActionMailer::Base.deliveriesいるのは、メール オブジェクトの配列です。メール要素が電子メールと一致することは期待できません。それは正しくありません。toメールと比較できるのはメールオブジェクトのメソッドだけです。

あなたはこのようにすることができます

last_email = ActionMailer::Base.deliveries.last
expect(last_email.to).to have_content(user.email)

追加

OPは、これはユーザーのグループに送信される複数の電子メール用であると追加しました。かなり合理的です。次の方法をお勧めします。

ステップ 1: 各例のメールをクリアする

before { ActionMailer::Base.deliveries = [] }

toステップ 2:簡単に比較できるようにすべてを配列に入れる

it "will check if email is sent" do
  emails = []
  ActionMailer::Base.deliveries.each do |m|
    emails << m.to
  end
  expect(emails).to include(user.email)
end

ユーザーの問題に関する別の注意: 完全なコードは見ていません。しかし、間違ったユーザーの問題に遭遇した場合はlet、ファクトリを定義する代わりにインスタンス変数を使用する方が安全です。

# Remove this line
# let(:user) { FactoryGirl.create(:user) }
@user = FactoryGirl.create(:user)

expect(emails).to include(@user.email)
于 2013-05-27T17:53:44.493 に答える