我有程序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
,因为错误是自动生成的?
答案 0 :(得分:3)
假设您正在使用minitest,如果您尝试测试是否引发了错误,则可以使用asert_raises
方法。 (注意复数形式)
def test_negative
assert_raises <expected error name> do
factorial(-1)
end
end
但是,到目前为止您所提供的示例不会引发任何错误。
其他信息:
此示例(1..-5).inject(:*)
将评估为nil。你不会得到错误。我假设您的test_negative
应该断言,鉴于您当前的实施,返回值为1
。
此外,如果您想提供一个默认值,您可以将其作为第一个参数传递:(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