我有一个名为RemoteError的类,上面有一个self.fatal方法。此方法作业基本上是捕获异常,将异常的详细信息发送到服务器,然后传播异常以终止程序。

class RemoteError
  def initialize(label, error)
    @label = label
    @error = error
  end

  def self.fatal(label, error)
    object = new(label, error)
    object.send
    raise error
  end

  def send
    # send the error to the server
  end
end

我正在尝试为RemoteError.fatal方法编写测试。这很困难,因为在方法中调用了raise。每次我运行测试时,raise显然会引发异常,我无法测试调用了send
  describe "fatal" do
    it "should send a remote error" do
      error = stub
      RemoteError.stub(:new) { error }
      error.should_receive(:send)

      RemoteError.fatal(stub, stub)
    end
  end

有没有一种方法,我可以存根或以某种方式规避raise这个特定的测试?

最佳答案

您可以将引发错误的方法包装在lambda中…

it "should send a remote error" do
  ...

  lambda { RemoteError.fatal(stub, stub) }.should raise_error(error)
end

这实际上允许调用该方法,并从中获取返回值或引发的错误,然后使用.should raise_error(error)对其进行断言。这也使得如果该调用没有引发错误,测试将正常失败。
换一种说法,您不需要也不希望存根raise。只需将其包装在lambda中,代码将继续执行,您应该能够确保消息已发送,并且测试不会退出/崩溃。

关于ruby - 我可以在Ruby中 stub “筹集”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9177875/

10-11 23:19