我在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的一个实例,而context
是activities
表中的varchar列。我不在模型中重载了context
的getter或setter。它就像你能得到的香草一样。
我感到困惑 - 我以前从未见过这一点,并且所有试图孤立原因的尝试都证明是徒劳的,谷歌搜索也是如此。
答案 0 :(得分:2)
听起来方法context
在测试环境中被覆盖。它可能只是在测试中使用的东西(例如模拟框架)。或者在测试下加载顺序可能不同,导致在加载模型后包含插件或lib。
您是否尝试将context
属性重命名为其他内容?
更新:您是否在测试中使用了Shoulda?这可以解释这个问题。我相信这会在Object上定义一个context
方法,导致您的Activity模型继承此方法。 ActiveRecord懒惰地定义列访问器方法(通过方法丢失),由于方法已经定义,因此永远不会被触发。我建议重命名属性。
或者,您可以手动定义上下文方法。
# in activity.rb
def context
read_attribute(:context)
end