我有一种从CLI触发的方法,它具有明确退出或中止的逻辑路径.我发现在编写这个方法的规范时,RSpec将它标记为失败,因为退出是异常.这是一个裸体的例子:
def cli_method if condition puts "Everything's okay!" else puts "GTFO!" exit end end
我可以用lambda来包装spec,应该是raise_error(SystemExit),但是忽略块内发生的任何断言.要清楚:我没有测试退出本身,而是在它之前发生的逻辑.我可以如何去指定这种类型的方法?
解决方法
简单地把你的断言放在lambda之外,例如:
class Foo attr_accessor :result def logic_and_exit @result = :bad_logic exit end end describe 'Foo#logic_and_exit' do before(:each) do @foo = Foo.new end it "should set @foo" do lambda { @foo.logic_and_exit; exit }.should raise_error SystemExit @foo.result.should == :logics end end
当我运行rspec,它正确地告诉我:
expected: :logics got: :bad_logic (using ==)
有没有这种情况对你来说不行?
编辑:我在lambda中添加了一个’exit’调用,以处理逻辑不和不退出的情况.
EDIT2:更好的是,在测试中做这个:
begin @foo.logic_and_exit rescue SystemExit end @foo.result.should == :logics