assert_equal in MiniTest

PUBLISHED ON FEB 15, 2015 — IMPORTED FROM TUMBLR, TEXT

@chrisbodhi I also find it difficult to understand how the test cases are passed. I’ve checked them and they do, but in my opinion test_name_sticks should fail as every call to name will append a new random name to the previous one instead of returning the same string. For example, if we run a simple test:

robot = Robot.new
2.times{puts robot.name}
we get:
QF658
QF658YV199
making it clear that the test should fail. —franrodalg

If I’m understanding the question, it looks like that assert_equal calls robot.name twice; since the two return values are different, the test should fail. I wasn’t sure how that method works, so I peeked at the source here [thankfully, it’s also written in Ruby]. The method takes two values: the expected output and the actual output. It uses the system’s diff tool to compare the two arguments and then proceeds based on the value returned by the diff.

I haven’t used a lot of the Unix tools before, so I fired up pry and copied in my Robot class. I created a new robot instance [you can see in the returned object that the @name value is instantiated as an empty string] and used %x to run system [Unix] commands in the REPL, passing in the string-interpolated robot.name twice.

robot = Robot.new
=>#<Robot:0x007fff134761b0 @name="">
%x(diff -u #{robot.name} #{robot.name})
diff: XP677XA768: No such file or directory
diff: XP677XA768: No such file or directory
=>""

I initially thought the diff would compare robot.name as a static object [something like nombre = robot.name and then diff -u #{nombre} #{nombre}], so I was surprised to see that the method gets called twice. However, it seems that the methods are running before the diff tool does its thing. I’m willing to wager that the object ID is the same for both return values. So, even though the return value doesn’t meet the requirements for a robot name [two letter, three numbers], the value does persist and the test passes.

Find the entire discussion here.