Ruby,rspec测试方法时预计会出现错误



我有一个看起来像build_object(arg1, arg2, arg3, arg4, arg5)的方法,我想在为arg5传递某个值时测试这个方法。

我正在尝试类似的东西

expect(my_method(p1, p2, p3, p4, bad5)).to raise_error(ArgumentError)

我得到以下错误:

ArgumentError:
The expect syntax does not support operator matchers, so you must pass a matcher to `#to`.

我是Ruby和rspec测试的新手,所以任何帮助都将不胜感激。请解释一下你的答案在做什么,以便我了解。

在编写检查raise_error的规范时,必须对expect:使用块语法{}

expect { my_method(p1, p2, p3, p4, bad5) }.to raise_error(ArgumentError)

这个问题的答案中有一个更深入的解释,但你要求解释,所以我给你一个缩写:

大多数rspec匹配器都是值匹配器。这意味着类似这样的东西:

expect(some_method).to eq(value)

实际上是在说:

执行some_method并获取其返回值,然后将其返回值与value进行比较,并在该比较上判断该规范的成功或失败

当您试图测试一些有副作用的代码时,比如可能引发异常,rspec需要接收一块代码才能运行。它有点像:

expect { <some block of code> }.to raise_error(ArgumentError)

执行<some block of code>,然后将执行该代码时发生的情况与预期发生的情况进行比较,并在比较上判断该规范的成功或失败

以上链接问题的答案详细介绍了何时需要使用expect {}和何时需要使用expect()

最新更新