Ruby的Test::Unit
有assert_nothing_raised
。 Test::Unit
已被MiniTest取代。为什么MiniTest的断言/期望与此没有任何平行?例如,您可以must_raise
但不能wont_raise
。
答案 0 :(得分:47)
MiniTest在其Test :: Unit兼容层中实现assert_nothing_raised
,但在其自己的测试中(MiniTest::Unit
和MiniTest::Spec
),它不实现任何像这样测试。原因是,程序员认为,对所引发的任何事情的测试都不是对任何事情的考验;除非您正在测试 异常,否则永远不会期望在测试中引发任何内容。如果测试代码中出现意外(未捕获)异常,您将在测试中按顺序报告异常,并且您将知道存在问题。
示例:
require 'minitest/autorun'
describe "something" do
it "does something" do
Ooops
end
end
输出:
Run options: --seed 41521
# Running tests:
E
Finished tests in 0.000729s, 1371.7421 tests/s, 0.0000 assertions/s.
1) Error:
test_0001_does_something(something):
NameError: uninitialized constant Ooops
untitled:5:in `block (2 levels) in <main>'
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
这正是您想知道的。如果你没有想要什么可以被提出,你就没有得到它,而且你已经被告知了。
所以,这里的论点是:不要使用assert_nothing_raised
!这只是一个毫无意义的拐杖。例如,见:
https://github.com/seattlerb/minitest/issues/70
https://github.com/seattlerb/minitest/issues/159
http://blog.zenspider.com/blog/2012/01/assert_nothing_tested.html
另一方面,显然assert_nothing_raised
对应于用户之间的某种直觉,因为很多人都希望wont_raise
与must_raise
一起使用,等等。特别是有人想关注关于此的断言,而不仅仅是一个测试。幸运的是,MiniTest非常极简和灵活,所以如果你想添加自己的例程,你可以。因此,您可以编写一个无异常测试的方法,如果没有异常则返回已知结果,现在您可以断言该已知结果。
例如(我不是说这是完美的,只是表明了这个想法):
class TestMyRequire < MiniTest::Spec
def testForError # pass me a block and I'll tell you if it raised
yield
"ok"
rescue
$!
end
it "blends" do
testForError do
something_or_other
end.must_equal "ok"
end
end
关键不在于这是一个好主意还是坏主意,但MiniTest从来没有责任为你做这件事。
答案 1 :(得分:9)
如果您需要:
# test_helper.rb
module Minitest::Assertions
def assert_nothing_raised(*)
yield
end
end
使用它:
def test_unknown_setter
assert_nothing_raised do
result.some_silly_column_name = 'value'
end
end
答案 2 :(得分:3)
这足以让我深入了解MiniTest源代码并在我的spec_helper.rb
文件中提供实现:
module MiniTest
module Assertions
def refute_raises *exp
msg = "#{exp.pop}.\n" if String === exp.last
begin
yield
rescue MiniTest::Skip => e
return e if exp.include? MiniTest::Skip
raise e
rescue Exception => e
exp = exp.first if exp.size == 1
flunk "unexpected exception raised: #{e}"
end
end
end
module Expectations
infect_an_assertion :refute_raises, :wont_raise
end
end
希望这对于需要wont_raise
的其他人也有帮助。干杯! :)