如何使用 assert_raise 来测试 Ruby 中的错误?
How to use assert_raise to test for an error in Ruby?
我有程序 factorial.rb
和 test_factorial.rb
。前者看起来像这样:
def factorial(n)
(1..n).inject(:*) || 1
end
test_factorial
看起来像这样:
def test_number
assert_equal 6, factorial(3),"3! should be 6"
end
def test_zero
assert_equal 1, factorial(0), "0! should be 1"
end
我需要添加另一种方法,test_negative
到测试文件,确认阶乘为负时引发错误。我查看了文档,但仍然不明白我应该做什么。我必须在 assert_raise
之后指定某种类型的错误吗?由于错误是自动生成的,我是否需要向 factorial.rb
添加代码?
假设您正在使用 minitest,如果您尝试测试是否出现错误,则可以使用 asert_raises
方法。 (注意复数形式)
def test_negative
assert_raises <expected error name> do
factorial(-1)
end
end
但是,到目前为止您提供的示例不会出现错误。
附加信息:
此示例 (1..-5).inject(:*)
的计算结果为 nil。你不会得到一个错误。我假设你的 test_negative
应该断言 return 值是 1
给定你当前的实现。
此外,如果您想给 inject 一个默认值,您可以将其作为第一个参数传递:(1..n).inject(1, :*)
。这样您就可以避免使用 ||
运算符。
下面@ArupRakshit 的一个很好的建议是提出您自己的 NegativeFactorial
异常。您需要先定义它。
class NegativeFactorial < StandardError; end
然后你可以像这样在你的阶乘方法中使用它:
def factorial(n)
raise NegativeFactorial, "The number provided is negative." if n < 0
(1..n).inject(1, :*)
end
并且您可以实现您的 test_negative
以断言已引发异常。
def test_negative
assert_raises NegativeFactorial do
factorial(-1)
end
end
我有程序 factorial.rb
和 test_factorial.rb
。前者看起来像这样:
def factorial(n)
(1..n).inject(:*) || 1
end
test_factorial
看起来像这样:
def test_number
assert_equal 6, factorial(3),"3! should be 6"
end
def test_zero
assert_equal 1, factorial(0), "0! should be 1"
end
我需要添加另一种方法,test_negative
到测试文件,确认阶乘为负时引发错误。我查看了文档,但仍然不明白我应该做什么。我必须在 assert_raise
之后指定某种类型的错误吗?由于错误是自动生成的,我是否需要向 factorial.rb
添加代码?
假设您正在使用 minitest,如果您尝试测试是否出现错误,则可以使用 asert_raises
方法。 (注意复数形式)
def test_negative
assert_raises <expected error name> do
factorial(-1)
end
end
但是,到目前为止您提供的示例不会出现错误。
附加信息:
此示例
(1..-5).inject(:*)
的计算结果为 nil。你不会得到一个错误。我假设你的test_negative
应该断言 return 值是1
给定你当前的实现。此外,如果您想给 inject 一个默认值,您可以将其作为第一个参数传递:
(1..n).inject(1, :*)
。这样您就可以避免使用||
运算符。
下面@ArupRakshit 的一个很好的建议是提出您自己的 NegativeFactorial
异常。您需要先定义它。
class NegativeFactorial < StandardError; end
然后你可以像这样在你的阶乘方法中使用它:
def factorial(n)
raise NegativeFactorial, "The number provided is negative." if n < 0
(1..n).inject(1, :*)
end
并且您可以实现您的 test_negative
以断言已引发异常。
def test_negative
assert_raises NegativeFactorial do
factorial(-1)
end
end