0

@statusブロックのパフォーマンスに基づいて、オブジェクトのインスタンス変数を更新しようとしています。このブロックは、別のクラスへの呼び出しも行います。

def run
  @entries.keep_if { |i| valid_entry?(i) }.each do |e|
    begin
      unique_id = get_uniqueid e
      cdr_record = Cdr.find_by_uniqueid(unique_id).first
      recording = cdr_record.nil? ? NullAsteriskRecording.new : AsteriskRecording.new(cdr_record, e)
      recording.set_attributes
      recording.import
    rescue Exception => e
      fail_status
    end
  end
end

fail_statusインスタンス変数を に更新するプライベート メソッドです:failed。他のいくつかのことを壊して、基本的にこのコードが機能することを確認しましたが、テストも行いたいです。現在、私は次のものを持っています:

context "in which an exception is thrown" do
  before do
    @recording = double("asterisk_recording")
    @recording.stub(:import).and_raise("error")
  end

  it "should set #status to :failed" do
    # pending "Update instance variable in rescue block(s) of #run"
    subject.run
    subject.status.should eq :failed
  end
end

しかし、テストは常に失敗します。ブロックが評価されることはありません(ステートメントでハードコードしたときに評価されるステートメントでrescueチェックしました)。ここで機能を間違って使用していますか? それとも、ブロックが実行されないように、例外をスタブアウトすることで自分自身をやっていますか?putsraisedoublerescue

4

1 に答える 1

0

before ブロックで @recording を設定しましたが、run メソッド用に投稿したコードはその @recording インスタンスを使用しないため、run メソッドで recording.import を呼び出しても例外は発生しません。

run メソッドでは、記録は NullAsteriskRecording または AsteriskRecording のインスタンスになる可能性があります。現在のテストが示すように、それが AsteriskRecording になることがわかっている場合、1 つのアプローチは before ブロックを次のように変更することです。

before do
  AsteriskRecording.any_instance.stub(:import).and_raise("error")
end
于 2013-06-22T19:15:32.753 に答える