views:

100

answers:

1

I have a functional test suite failing in a Rails 2.2.2 application. The exception thrown, and the associated lines are below:

ActionView::TemplateError: Attempt to call private method

On line #55 of app/views/wine/view.html.erb

53:     <% for activity in @activities %>
54:     
55:     <% if activity.context == 'ItemComment' %>
56:     <%= render :partial => 'item_comments/comment', :object => ItemComment.find(activity.context_id) %>
57:     <% elsif activity.context == 'Review' %>
58:     <%= render :partial => 'reviews/review', :object => Review.find(activity.context_id) %>

This code functions as expected in every other environment besides test; moreover activity is merely an instance of an ActiveRecord called Activity, and context is a varchar column within the activities table. I am not overloading the getter or setter for context in the model. It is about as vanilla as you can get.

I'm baffled — I have never seen this before, and all attempts to isolate the cause have proved futile, as have Google searches.

+2  A: 

It sounds like the method context is being overridden in the test environment. It may be something only used in testing (such as a mocking framework). Or the load order may be different under the tests causing a plugin or lib to be included after your model is loaded.

Have you tried renaming the context attribute to something else?

Update: Are you using Shoulda in testing? That would explain the problem. I believe this defines a context method on Object causing your Activity model to inherit this. ActiveRecord defines the column accessor methods lazily (through method missing) which never gets triggered because the method is already defined. I suggest renaming the attribute.

Alternatively you can define the context method manually.

# in activity.rb
def context
  read_attribute(:context)
end
ryanb
Ryan Bates is finally here.. Great! Really looking forward to more answers from you. Thanks,Swanand
Swanand
great, great answer, and seems to be spot-on. i didn't even think to think that shoulda was causing it. i'll try defining context explicitly in the model. thanks!
Kyle