The other day Aaron Patterson
asked whether it
was OK to teach rspec vs Test::Unit for Ruby beginners.
My own experience was that rspec was really confusing at first: it appears to
have a lot of magic. The hard part was understanding where methods and matchers
came from. I Don’t like magic, I like to understand how things work.
I was familiar with other unit testing frameworks where you inherit from a base
class and got access to the assertion functions via inheritance. That made
complete sense to me.
But rspec is different: there’s no explicit class definition, and methods that
aren’t monkey-patched onto objects appear out of nowhere. And how come I can use
a before(:each)
block to write to a @
prefixed variable? Isn’t that an
instance variable? But I’m not inside a class!
I did, however, prefer the tree-like structure of nested test cases and liked
how the code read as a description of behavior rather than a list of
assertions.
Attempting to write my own DSL a few months later helped me piece together a
rough understanding of how all that magic works.
Hint: Its not actually magic.