我有一个名为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/