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.

June 13th, 2008 at 7:11 am
Hey George,
My immediate answer to why the session needs to be initialized is that the FakeRequest object is optimized to improve testing speed, and you don’t always need the session when testing, so that’s why it doesn’t create it.