いくつかのレコードを反復処理し、各レコードのインスタンスメソッドを実行するクラスメソッドがあります。クラスメソッドの簡単なテストを作成して、インスタンスメソッドが各レコードに送信されていることを確認しようとしています。
it "fires any pending alarms" do
pending = create :alarm, :pending
other_pending = create :alarm, :pending
# sanity check
Alarm.pending.sort.should eq [pending, other_pending].sort
pending.should_receive(:fire)
other_pending.should_receive(:fire)
Alarm.fire_pending
end
alarm.rb
class Alarm < ActiveRecord::Base
scope :pending, where(pending: true)
def self.fire_pending
self.pending.each do |alarm|
alarm.fire
end
end
end
しかし、私は両方のshould_receive
期待でエラーを受け取っています:
Failure/Error: pending.should_receive(:fire)
(#<Alarm:0x007fcc96334310>).fire(any args)
expected: 1 time
received: 0 times
私は以前にこの期待をうまく利用しました。明らかな何かが欠けているのではないかと思います。
編集
私は今のところこれでそれを回避しました:
it "fires any pending alarms" do
pending = create :alarm, :pending
other_pending = create :alarm, :pending
pending_alarms = Alarm.pending
pending_alarms.sort.should eq [pending, other_pending].sort
Alarm.stub(:pending) { pending_alarms }
pending_alarms.first.should_receive(:fire)
pending_alarms.last.should_receive(:fire)
Alarm.fire_pending
end
しかし、私はそれが本当に好きではなく、なぜ私の最初の試みがうまくいかないのか知りたいです。