gpt4 book ai didi

ruby - 整个测试完成后如何报告所有失败?

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:57 25 4
gpt4 key购买 nike

我将 Ruby 1.9.3 与 MiniTest 结合使用。我知道最好的做法是每次测试有一个断言,但有些情况下我想动态地做出断言,比如比较数组时:

if added_skus.each { |s| assert(skus_in_cart.include?(s), "SKUs #{added_skus} or SKU amount do not match SKUs #{skus_in_cart} on Cart page.") }
puts "Product SKUs #{added_skus} match SKUs #{skus_in_cart} on Cart page."
end

如您所知,当遇到第一个断言失败时,测试就会结束。我想继续测试并在测试完成后报告所有失败。

我找到了使用旧版本的 test/unit 和 Ruby 1.8.7 的解决方案(test/unit 库中的 add_failure 方法),但我找不到适用于 MiniTest 和 Ruby 1.9.3 的解决方案。我真的很感激一些反馈(即使这意味着我做错了 - 请指出正确的方向)。谢谢!

最佳答案

解决方案 1 - 将断言合并为一个断言:

通过综合考虑所有 skus,您可以将当前代码编写为单个断言:

#Determine the missing skus:
missing_skus = added_skus.find_all{ |s| not(skus_in_cart.include?(s)) }

#Assert that there are no missing skus:
assert( missing_skus.empty?, "SKUs #{missing_skus} do not match SKUs on Cart page." )

解决方案 2 - 断言多个元素的自定义方法:

如果您确实希望每个 SKU(而不是整个集合)的断言计数,您可以创建自定义断言方法。尽管我认为这不会比解决方案 1 增加任何实际好处。

示例运行代码:

需要'测试/单元'

module MiniTest::Assertions
#Asserts that each element passes the test
# Inputs:
# enumerable - The object to iterate over (ex an array)
# msg - Custom message to include in assertion failure
# test - A block that each element will be tested against
def assert_each(enumerable, msg = nil, &test)
msg ||= "No message given."

failed_elements = Array.new
enumerable.each do |e|
self._assertions += 1
failed_elements << e unless yield(e)
end

msg = " #{failed_elements} failed assertion. #{msg}"
raise( MiniTest::Assertion, msg ) unless failed_elements.empty?
end
end

class MyTest < Test::Unit::TestCase
def test()
added_skus = ['b', 'a', 'c', 'd']
skus_in_cart = ['c', 'b']

assert_each(added_skus, "SKUs missing from cart."){ |s| skus_in_cart.include?(s) }
end
end

关于ruby - 整个测试完成后如何报告所有失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14543923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com