2017-10-23 12 views
0

Mocha on Rails 4.2を使用する。 正しいパラメータで別のメソッドを呼び出すメソッドをテストしています。これらのパラメータは、データベースから呼び出すActiveRecordオブジェクトです。ここで重要なラインは、私のテストである:特定のActiveRecordパラメータでメソッドを実行するにはどうすればよいですか?

UserMailer.expects(:prompt_champion).with(users(:emma), [[language, 31.days.ago]]).once 

users(:emma)languageの両方がActiveRecordのオブジェクトです。

正しい呼び出しが行われても、パラメータが期待値と一致しないため、テストは失敗します。これは、レコードがデータベースから引き上げられるたびに異なるRubyオブジェクトだからだと思います。

私は、レコードをプルアップしてモックを返すためにそのメソッドをスタブするために、どのメソッドが私のコードで使用されているのかを見ていると思いますが、レコードの全体が検索してから適切なものに絞り込み、それらのレコードをすべて嘲笑すると、テスト方法が複雑になります。

これを行うには良い方法がありますか?

答えて

1

allow/expectのブロック形式を使用できます。

expect(UserMailer).to receive(:prompt_champion) do |user, date| 
    expect(user.name).to eq "Emma" 
    expect(date).to eq 31.days.ago # or whatever 
end 
0

RSpec custom matcherを使用して、その機能の期待値を比較することができます。

0

セルジオが最良の答えを出し、私はそれを受け入れました。私はその答えを独立して発見し、すべてを正しく動作させるためにActionMailerメソッドからモックを返す必要があることを発見しました。

他の不運な冒険者のためにここに私の完全なテストをここに掲載するのが最善だと思います。私はMinitest-Specを使用しています。

it 'prompts champions when there have been no edits for over a month' do 
    language.updated_at = 31.days.ago 
    language.champion = users(:emma) 
    language.save 
    mail = mock() 
    mail.stubs(:deliver_now).returns(true) 
    UserMailer.expects(:prompt_champion).with do |user, languages| 
     _(user.id).must_equal language.champion_id 
     _(languages.first.first.id).must_equal language.id 
    end.once.returns(mail) 
    Language.prompt_champions 
end 
関連する問題