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块永远不会被评估(我检查了一个puts在我在语句中硬编码时将被评估的raise语句)。我在这里使用了double错误的功能吗?或者我是通过排除异常来做自己,所以该rescue块永远不会运行?

4

1 回答 1

0

您在 before 块中设置了 @recording,但您为 run 方法发布的代码不会使用该 @recording 实例,因此在 run 方法中对 recording.import 的调用不会引发异常。

在您的 run 方法中,录制最终可能是 NullAsteriskRecording 或 AsteriskRecording 的一个实例。如果您知道这将是当前测试所暗示的 AsteriskRecording,则一种方法是将您的 before 块更改为以下内容:

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