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

Mar*_*ark 2 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`.
Run Code Online (Sandbox Code Playgroud)

我对 Ruby 和 rspec 测试非常陌生,因此感谢您提供任何帮助。请解释您的答案在做什么,以便我学习。

ano*_*rmh 6

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

expect { my_method(p1, p2, p3, p4, bad5) }.to raise_error(ArgumentError)
Run Code Online (Sandbox Code Playgroud)

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

大多数 rspec 匹配器是值匹配器。这意味着类似这样的事情:

expect(some_method).to eq(value)
Run Code Online (Sandbox Code Playgroud)

真的是在说:

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

当您尝试测试某些具有副作用的代码(例如可能引发异常)时,rspec 需要接收要运行的代码块。它更像是:

expect { <some block of code> }.to raise_error(ArgumentError)
Run Code Online (Sandbox Code Playgroud)

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

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