ruby - 如何使用 assert_raise 来测试 Ruby 中的错误?

标签 ruby unit-testing testing assert factorial

我有程序 factorial.rbtest_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 应该断言返回值为 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

关于ruby - 如何使用 assert_raise 来测试 Ruby 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28596800/

相关文章:

ruby - 图数据库/语言组合的推荐

ruby - Ruby 中的内省(introspection)

javascript - 更改 mocha 的默认超时

unit-testing - 有哪些可用于 D 的模拟对象库?

iPhone OpenGL fps 测试

forms - 我无法从导入了 FormsModule、ReactiveFormsModule 的 TestBed 获取 FormBuilder

c++ - 将 ruby​​ 库静态链接到 C++ 应用程序

ruby-on-rails - 在整个 Rails 应用程序中使用一个客户端实例进行外部服务

unit-testing - 如何正确测试将 Mongoose 查询作为 Promise 返回的函数

javascript - 尝试使用 Protractor 选择消息时索引带外