如何断言Rails方法不会抛出NoMethodError

时间:2015-08-05 16:10:45

标签: ruby-on-rails unit-testing

在我的Rails应用程序中,我正在进行单元测试,我希望在调用某个方法时出错。

test "sending a logout request while not logged should not return an error" do
  assert_nothing_raised do
    do_a_logout
  end
end

问题是当do_a_logout出错时,测试会将报告保持为错误而不是失败

错误为NoMethodError: NoMethodError: undefined method 'forget' for nil:NilClass

这种方法来自do_a_logout调用

以下两三级
def forget user
  user.forget
  cookies.delete :user_id
  cookies.delete :remember_token
end

在这里,我期待的错误是user为零并且在调用forget时失败。如何使测试报告成为失败而不是错误

2 个答案:

答案 0 :(得分:2)

您希望将assert_raise与您期望的例外类一起使用:

assert_raise(NoMethodError) { do_a_logout }

ETA:如果您想测试没有引发任何错误,可以使用assert_nothing_raised

assert_nothing_raised { do_a_logout }
assert_nothing_raised(NoMethodError) { do_a_logout }

然而正如on SOelsewhere指出的那样,没有充分的理由使用这个断言,因为它是多余的:你从不期望引发错误,除非你另有说明。

此外,与没有断言运行规范相比,它提供的帮助更少。特别是,在发生错误时使用assert_nothing_raised运行将仅为assert_nothing_raised调用提供回溯,而在没有此断言的情况下运行规范将给出发生的实际错误的回溯

答案 1 :(得分:1)

基于@nus comment

test "sending a logout request while not logged should not return an error" do
  do_a_logout
  # assert true # optional
end

assert_silent { do_a_logout }