在我的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
时失败。如何使测试报告成为失败而不是错误?
答案 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 SO和elsewhere指出的那样,没有充分的理由使用这个断言,因为它是多余的:你从不期望引发错误,除非你另有说明。
此外,与没有断言运行规范相比,它提供的帮助更少。特别是,在发生错误时使用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 }