ActionView的私有方法调用异常

时间:2009-07-31 23:24:06

标签: ruby-on-rails exception testing

我在Rails 2.2.2应用程序中遇到功能测试套件失败。抛出的异常,以及相关的行如下:

  

ActionView :: TemplateError:尝试调用私有方法

     

app / views / wine / view.html.erb

的第55行
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) %>

除了测试之外,此代码在其他所有环境中都能正常运行;此外,activity只是名为Activity的ActiveRecord的一个实例,而contextactivities表中的varchar列。我在模型中重载了context的getter或setter。它就像你能得到的香草一样。

我感到困惑 - 我以前从未见过这一点,并且所有试图孤立原因的尝试都证明是徒劳的,谷歌搜索也是如此。

1 个答案:

答案 0 :(得分:2)

听起来方法context在测试环境中被覆盖。它可能只是在测试中使用的东西(例如模拟框架)。或者在测试下加载顺序可能不同,导致在加载模型后包含插件或lib。

您是否尝试将context属性重命名为其他内容?

更新:您是否在测试中使用了Shoulda?这可以解释这个问题。我相信这会在Object上定义一个context方法,导致您的Activity模型继承此方法。 ActiveRecord懒惰地定义列访问器方法(通过方法丢失),由于方法已经定义,因此永远不会被触发。我建议重命名属性。

或者,您可以手动定义上下文方法。

# in activity.rb
def context
  read_attribute(:context)
end