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
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.