2016-05-13 7 views
0

最近、私はamazon ses経由でメールを送信するようにレールアプリを切り替えました。テストamazon sesメール送信を使用しているときにRspecテストが失敗する

config.action_mailer.delivery_method = :test 

TypeError: can't convert Fixnum into String # (eval):3:in 'send_raw_email'

は私が適切に設定されたテスト環境のメール設定を持っています。メールの送信は、しかし、テストは次のエラーでメールアイテムの周りに失敗し、正常に動作します電子メールを送信しないことでエラーが発生するのを防ぐことができますが、配信されていないメールについてはエラーが発生します。何が起こっているかの

rails (3.2.12) 
rspec (2.8.0) 
cucumber (2.3.3) 
aws-sdk (1.33.0) 

任意の提案、またはどのようにこの問題を回避するには:

config.action_mailer.perform_deliveries = false 
should_change -> { ActionMailer::Base.deliveries.size } do 
    result should have changed, but is still 0 

宝石のバージョンは以下の通りです。他の情報が必要な場合は、私に知らせてください。これは、amazon sesを使用するメールの送信を切り替える前にうまくいきました。

EDIT:

失敗しているテストは、電子メールを含むその全てが

BlahMailer.send_invite(team).deliver 

これは、モデル内にあるとコントローラを.deliver使用して送信されているテストはわずかに関連した経路を呼び出しますモデル内の関連する関数を呼び出すことができます。エラーは、ses関数であるsend_raw_emailから来ていることを示しているため、表示する内容はわかりません。アプリケーションのコードは表示されません。

EDIT 2:複数コード

ここでは、この例では、モデルとそれぞれのテストのために工場を設定し、試験の一つです。ここで

before :each do 
    subject = Factory(:ticket, action_type: 'name_change', team_name: 'test123') 
end 

はRSpecの

Factory.define :ticket do |ticket| 
    team = nil 
    ticket.team { team = Factory(:team) } 
    ticket.creator { team.captain } 
    ticket.subject { Factory(:team_assignment, team: team, user: Factory(:active_user)).user } 
end 

の工場である。そして、ここで私はストレートのテキストを入れて試してみました

%w(requested approved cancelled accepted).each do |state| 
    define_method "notify_#{state}" do 
    TicketMailer.send("#{action_type}_#{state}", self).deliver 
    end 
end 

電子メールが送信された場所の周りのモデルのコードです基本的にはメーラーと関係がありますが、問題がないことを確認するだけです。もうモデルや実際のメーラーが必要な場合は、私に知らせてください。私は本当にこれがどこで死んでいるのか分かりません。私の唯一の結論はaws sdkとrspecの古いバージョンのバグです。私もaws-sdkを新しいバージョンに置き換えようとしましたが、他のものを稼働させるのにはまだ失敗しました。

+1

誰でも手助けするコードが必要です。 [編集](http://stackoverflow.com/posts/37216571/edit)あなたの質問は、テストしているメソッドと失敗しているテストの両方を含めることができます。 –

+0

すべてのコールがやっているので、私があなたに見せてくれるものが何であるかはっきりしません.deliverをやっていて、deliver_methodをamazon_sesに変更する前に働いていました。これはaws-sdk宝石の問題かもしれませんか? – Mentch

+0

この場合、「チーム」とは何ですか?より多くのコード・コンテキストを含めると便利です。 –

答えて

0

config.action_mailer.perform_deliveries = falseを設定しているため、配送が行われていないため、ActionMailer::Base.deliveriesは常に空のコレクションになります。

電子メール配信をテストする場合は、config.action_mailer.perform_deliveries = trueと設定し、ユーザーに電子メールを送信しないようにインターセプタを使用してください。

lass SandboxEmailInterceptor 
    def self.delivering_email(message) 
    recipients = 
     if Rails.env.test? 
     [ 
      "[email protected]" 
     ] 
     end 

    message.to = recipients 
    message.cc = [] 
    end 
end 

unless Rails.env.production? || Rails.env.test? 
    ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) 
end 
+0

私の質問を再読してください、私は何かをテストするためにそれらをfalseに設定し、送られていない電子メールに関してポップアップする新しいもの以外のエラーを修正しました。 – Mentch

関連する問題