如何避免在RSpec中"无用地使用== in void context"?

And*_*imm 14 ruby warnings rspec

在RSpec中,如果我有警告并且有

x.should == 42
another_line_of_code
Run Code Online (Sandbox Code Playgroud)

然后我收到警告

warning: useless use of == in void context
Run Code Online (Sandbox Code Playgroud)

有什么我可以做的除外

  1. 关闭警告
  2. 将其更改为 bitbucket = (x.should == 42)

Ger*_*rry 23

使用:

x.should eq(42)
Run Code Online (Sandbox Code Playgroud)

要么:

x.should be == 42
Run Code Online (Sandbox Code Playgroud)

或移动x.should == 42,使其成为it块内的最后一行.


对于那些思考但是为什么?

我是Ruby的完全菜鸟,但这是我的理解:

警告来自Ruby作为语句x.should == 421 == 1返回值.如果实际上没有使用此返回值(例如,分配给变量,用作函数的参数或从块返回),那么Ruby可以理解地认为首先使用该语句没有任何意义,并提醒您这一点.

要测试它,您可以使用-w标志启动irb并添加以下代码:

> irb -w

def example
  1 == 1
  :hello
end
Run Code Online (Sandbox Code Playgroud)

1 == 1应该在void上下文中发出关于无用==的警告.在没有:hello行的情况下尝试它,你将不会得到警告,因为1 == 1它将被用作return语句.

我知道Op和其他人已经理解了这一点.但是我想把这个发给像我这样的人,他们可能想知道为什么要抛出警告以及为什么提出的解决方案解决了这个问题.


Dav*_*sky 21

RSpec-2有一个eq(expected)匹配器就像==没有警告一样工作:

actual.should eq(expected) 
Run Code Online (Sandbox Code Playgroud)


Iva*_*van 7

你也可以使用actual.should be == expected.这完全取决于你认为看起来更漂亮的东西!