我可以在Ruby中存根"加注"吗?

Dav*_*ite 2 ruby testing rspec exception-handling exception

我有一类叫做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
Run Code Online (Sandbox Code Playgroud)

我正在尝试为该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
Run Code Online (Sandbox Code Playgroud)

有没有办法可以存根或以某种方式绕过raise这个特定的测试?

jef*_*unt 9

你可以包装在lambda中引发错误的方法......

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

  lambda { RemoteError.fatal(stub, stub) }.should raise_error(error)
end    
Run Code Online (Sandbox Code Playgroud)

这实际上允许调用该方法,并从中获取返回值或引发的错误,然后使用该方法断言.should raise_error(error).这也使得如果没有从该调用引发错误,则测试将正常失败.

换句话说,你不需要也不想要存根raise.只需将其包装在lambda中,您的代码将继续执行,您应该能够确保发送消息,并且您的测试不会退出/崩溃.

  • 你也可以使用`expect {} .to raise_error`表格,这个表格更容易理解. (4认同)