Testing Merb controllers
One of the features that attracted me to Merb was the ability to test controllers in an independent, lightweight manner. In essence, this involves instantiating a controller class, passing it a FakeRequest and calling methods (actions) on the controller object.
Let's consider a controller which collaborates with a service.
class Foo < Merb::Controller def bar service = Service.new session[:metal] = service.metal @zz = service.rock render end end class Service def rock "zz top" end def metal "metallica" end end
Testing the controller is as straightforward as creating an instance of
Foo
,
setting it up, calling
bar
and interrogating it.
class FooTest < Test::Unit::TestCase def setup @foo = Foo.new(Merb::Test::RequestHelper::FakeRequest.new) @foo.request.session = {} @foo.bar end def test_puts_metallica_in_session assert_equal("metallica", @foo.session[:metal]) end def test_assigns_zz_top assert_equal("zz top", @foo.assigns(:zz)) end end
I'm not sure why the controller's
session
variable has to be explicitly initialized, had it been present would make testing slightly cleaner.