内容简介:http://stackoverflow.com/questions/9219959/asserting-that-a-particular-exception-is-thrown-in-cucumber
脚本
我正在写一个图书馆(没有Ruby on Rails),我想要有非常详细的黄瓜功能.这特别包括描述在各种情况下应该抛出的错误/异常.
例
编写黄瓜步骤最直观的方式可能就是这样
When I do something unwanted Then an "ArgumentError" should be thrown
问题
我必须解决两个问题:
>抛出异常时,第一步不应该失败.
>第一步抛出的异常应该可以访问第二步,以做一些断言魔术.
不合理和繁琐的解决方案
我可以想出的最好的方法是在第一步中缓存异常,并将其放入第二步可以访问的实例变量中,如下所示:
When /^I do something unwanted$/ do begin throw_an_exception! rescue => @error end end Then /^an "(.*)" should be thrown$/ do |error| @error.class.to_s.should == error end
但是,这样做在第一步或多或少无用于我不希望失败的情况,而且需要一个实例变量,这绝对不是一件好事.
所以,任何人都可以帮我一个至少不那么麻烦的解决方案?或者我应该不同地写我的功能吗?任何帮助将不胜感激.
我再想一次,也许答案是:
没有优雅的解决方案,因为您的案件违反了 Given-When-Then 计划.
你期望“然后一个例外应该被抛出”是“当我做不需要的东西”的结果.
但是当你想到的时候,这不是真的!这个例外并不是这个动作的结果,实际上这个例外只是表示“When”-Statement failed.
我的解决办法是在较高层次上进行测试:
When I do something unwanted Then an error should be logged
要么
When I do something unwanted Then the user should get an error message
要么
When I do something unwanted Then the program should be locked in state "error"
或这些的组合.
那么你会在你的程序中“缓存异常” – 这是完全有道理的,因为你最有可能需要这么做.
你所说的两个问题也会解决.
如果您真的必须测试异常
那么我猜,那黄瓜不是正确的测试套件,嗯? :wink:
不管怎么说,由于给予 – 当时的计划,我只会写
When I do something unwanted it should fail with "ArgumentError"
并在步骤定义的东西(未经测试,请纠正我,如果你尝试)
When /^I do something unwanted it should fail with "(.*)"$/ do |errorstring| expect { throw_an_exception! }.to raise_error(errorstring) end
如上所述,这是可怕的错误,因为计划被打破,但它将服务于目的,不是吗? :wink:
您将在测试错误 at rspec expectations 找到进一步的文档.
http://stackoverflow.com/questions/9219959/asserting-that-a-particular-exception-is-thrown-in-cucumber
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning Vue.js 2
Olga Filipova / Packt Publishing / 2017-1-5 / USD 41.99
About This Book Learn how to propagate DOM changes across the website without writing extensive jQuery callbacks code.Learn how to achieve reactivity and easily compose views with Vue.js and unders......一起来看看 《Learning Vue.js 2》 这本书的介绍吧!