[LRUG] Parameterising a Rails 3 controller mixin

Murray Steele murray.steele at gmail.com
Tue Oct 4 06:12:17 PDT 2011


Oh! I'm an idiot. It's not mixing in the ControllerMixin that generates
current_foo, it's spinning up the app.  Perhaps if you changed the point at
which current_XXX is generated from app load time to ControllerMixin
include/extend/whatever time you could test it as I described.

But that's plainly more work.

Sorry.  Ignore me.  Delete this message.  Erase your history.

On 4 October 2011 13:33, Murray Steele <murray.steele at gmail.com> wrote:

> Can't you test the ControllerMixin directly?
>
> something like (written in email client, apologies for all the wrongness):
>
> class ControllerMixinTest < ActiveSupport::TestCase
>
>   class MyTest; end
>
>   test "the controller mixin supplies a current_foo when MyEngine.model is
> 'foo'" do
>     MyEngine.model = 'foo'
>
>     assert !MyTest.new.responds_to?(:current_foo)
>
>     MyTest.include ControllerMixin # or however it's supposed to be mixed
> in
>
>     assert MyTest.new.responds_to?(:current_foo)
>   end
>
>   # Then continue on to test what this magical current_foo method does.
> end
>
>
> On 4 October 2011 13:27, Andrew Stewart <boss at airbladesoftware.com> wrote:
>
>> Hola El Rug,
>>
>> I have a Rails 3 engine which mixes a module into ActionController::Base.
>>  The module provides helper methods in the controller such as `current_foo`.
>>
>> Now, however, I want to parameterise those methods based on a
>> configuration value.  So if somebody has a Bar model instead of a Foo model,
>> the controller will get a `current_bar` method.
>>
>> I think I have a working solution but I can't figure out how to test it.
>>  Here's what I've got:
>>
>>    module ControllerMixin
>>      # original hard-coded method:
>>      # def current_foo
>>      #   @current_foo ||= Foo.find(session[:current_foo_id]) if
>> session[:current_foo_id]
>>      # end
>>
>>      # parameterisable method:
>>      class_eval <<-END
>>        def current_#{MyEngine.model} ||=
>> #{MyEngine.model.classify.constantize}.find(session[:current_#{...}_id]) if
>> ...
>>      END
>>    end
>>
>> -- where MyEngine.model is set to 'foo' or 'bar' or whatever in an
>> initializer (defaults to 'foo').
>>
>> This appears to work when I use it in a Rails app, but I can't test the
>> 'bar' case in the engine's gem because the Rails app has already initialised
>> with the default value 'foo' before my test's setup method can set it to
>> 'bar'.  I.e.:
>>
>>    class BarTest < ActiveSupport::TestCase
>>      setup do
>>        MyEngine.model = 'bar'  # too late!  ActionController::Base already
>> has default `current_foo` mixed in
>>      end
>>
>>      test 'current_bar correctly defined' do
>>        ...  # fails because `current_foo` exists, not `current_bar`
>>      end
>>    end
>>
>> Any ideas?  Maybe a lazy-loading alternative to the class_eval approach or
>> somehow setting MyEnding.model before Rails spins up...?
>>
>> Cheers,
>> Andy Stewart
>>
>> -------
>> http://airbladesoftware.com
>> _______________________________________________
>> Chat mailing list
>> Chat at lists.lrug.org
>> http://lists.lrug.org/listinfo.cgi/chat-lrug.org
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lrug.org/pipermail/chat-lrug.org/attachments/20111004/2cd4baf5/attachment-0003.html>


More information about the Chat mailing list