我的断言示例如下,
class test < Test::Unit::TestCase
def test_users
begin
assert_equal(user.name, 'John')
assert_equal(user.age, 30)
assert_equal(user.zipcode, 500002)
rescue Exception
raise
end
end
end
如果任何一个断言失败,我应该继续处理下一个断言并收集失败断言并在结果结束时显示失败。
我使用了add_failure方法,它用于循环条件
rescue Test::Unit::AssertionFailedError => e
add_failure(e.message, e.backtrace)
任何人都可以帮忙吗?
答案 0 :(得分:0)
你的主要问题是assert_equal最终调用assert(如下所示),assert将引发ArgumentException。
文件测试/ unit / assertions.rb,第144行
def assert_equal(exp, act, msg = nil)
msg = message(msg) {
# omitted code to save space
}
assert(exp == act, msg)
end
文件测试/ unit / assertions.rb,第29行
def assert(test, msg = UNASSIGNED)
case msg
when UNASSIGNED
msg = nil
when String, Proc
else
bt = caller.reject { |s| s.rindex(MINI_DIR, 0) }
raise ArgumentError, "assertion message must be String or Proc, but #{msg.class} was given.", bt
end
super
end
你可以扩展Test :: Unit :: Assertions并提供一个不会引发ArgumentError的断言,这就是停止继续失败的断言。
请参阅this问题,获取有关朝这个方向发表建议并添加安全断言的建议。
答案 1 :(得分:0)
一个好的单元测试应该测试完全一件事,特别是为了避免你面对的问题。此测试用例将报告所有失败的测试,而不仅仅是第一次失败的测试:
class MyTest < Test::Unit::TestCase
def test_user_name
assert_equal(user.name, 'John')
end
def test_user_age
assert_equal(user.age, 30)
end
def test_user_zipcode
assert_equal(user.zipcode, 500002)
end
end
答案 2 :(得分:0)
请在Ruby失败后找到以下代码以继续断言:
def raise_and_rescue
begin
puts 'I am before the raise.'
raise 'An error has occured.'
puts 'I am after the raise.'
rescue
puts 'I am rescued.'
end
puts 'I am after the begin block.'
end
输出:
红宝石p045handexcp.rb
我在加薪之前。
我被救了。
我在开始障碍之后。
退出代码:0