1

次の失敗したテストがあります。

describe Image do
  describe 'a_method' do
    it 'sends email' do
      Image.count.should == 1
      expect do
        ImageMailer.deleted_image(Image.last.id).deliver
      end.to change(ActionMailer::Base.deliveries, :length)
    end
  end
end

そして、これが私のメーラーです:

class ImageMailer < ActionMailer::Base
  layout 'email'
  default from: 'whee@example.com'

  def deleted_image image_id, recipient='whee@example.com'
    @image = Image.find(image_id)
    subject = "Image email"
    mail(to: recipient, subject: subject) do |format|
      format.text
      format.html { render layout: 'email' }
    end
  end
end

私のテストは で失敗しFailure/Error: expect do length should have changed, but is still 0ます。メーラー自体の別のテストがあり、合格します。

describe ImageMailer do
  it 'should deliver the mail' do
    expect do
      subject.deliver
    end.to change { ActionMailer::Base.deliveries.length }.by(1)
  end
end

ActionMailer::Base.deliveriesモデル仕様では が常に空であるのに、メーラー仕様ではそうでない理由がわかりません。メールは明らかに機能します。私のモデルのテストはもともと異なっていて、私のモデルのメソッドがメールの送信を引き起こしたかどうかをテストしていましたが、それがメール配信の生成に失敗したとき、私は明示的にそのImageMailer.deleted_image(Image.last.id).deliver行を試しましたが、うまくいきませんでした。記述されているオブジェクトがメーラー クラスである RSpec テストについて何か特別なことはありますか?

config/environments/test.rb ファイルの関連する行を次に示します。

config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = {host: 'localhost:3000'}
config.action_mailer.perform_deliveries = true
4

1 に答える 1