[rspec-devel] actual.should != not_expected

Nick Sieger nicksieger at gmail.com
Tue Oct 17 10:03:18 EDT 2006

On 10/17/06, David Chelimsky <dchelimsky at gmail.com> wrote:
> NOTE that the error reads "4 should == 3". It looks as though ruby is
> actually delivering the == operator instead of !=. Now if you do this:
> irb(main):003:0> Object.methods.sort
> => ["<", "<=", "<=>", "==", "===", "=~", ">", ">=",...]
> ... you'll note that != is not an actual operator. So I'm not
> convinced that we can get this to work without a big change to rspec's
> internals.

I'm not convinced it's all that useful either.  The only reason I can see
would be the principle of least surprise, and the fact the negative
operators (!=, !~) don't behave as the others do.

I was curious about this behavior, so I dug in a little bit.  Apologies if
this is not new information for some, but I thought it might be worth

As you've probably guessed, Ruby treats the != operator as !(a == b).  The
problem for RSpec is that the should helper won't see the ! until after it's
too late.

For evidence, see Ruby's parse.y (line 1184 in 1.8.4):

        | arg tNEQ arg
            $$ = NEW_NOT(call_op($1, tEQ, 1, $3));

and this output from ParseTree:

echo "class A; def meth(actual, value); actual.value.should != value; end;
end" | parse_tree_show
     [:args, :actual, :value],
       [:call, [:call, [:lvar, :actual], :value], :should],
       [:array, [:lvar, :value]]]]]]]]]

So Ruby is evaluating "actual.should != value" as "!(actual.should ==
value)".  Unfortunately, it looks like you can't override the behavior of
the NOT operator (search for NODE_NOT in eval.c), so I don't see an easy way
for this to be implemented without adding further syntax to the RSpec DSL.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/rspec-devel/attachments/20061017/59cba5cf/attachment.html 

More information about the rspec-devel mailing list