我在Cucumber中写了一些基本步骤说明,并且无法弄清楚为什么它会抛出“方法丢失”错误。这是确切的错误:
undefined method `question' for nil:NilClass (ActionView::Template::Error)
此错误的根源是我的index.html.erb页面中的这一行:
<p id="question"><%= @question.question %></p>
所以看起来测试认为@question是零。我不确定为什么会这么想。我的步骤说明中应该更改什么?他们在这里:
Given /^a question$/ do
@question = Question.create!(:question => "here's my question..", :answer => "right_answer", :num => "1")
end
When /^I answer the question$/ do
visit root_path
fill_in "Answer", :with => "Wrong answer"
click_button "Submit answer"
end
第一步指令通过,但第二步不通过。
编辑:这是我的整个index.html.erb页面,以防它有用:
<% title "Questions" %>
<p id="question"><%= @question.question %></p>
<%= form_for @user_answer do |f| %>
<div><%= f.label :answer %></div>
<div><%= f.text_field :answer %></div>
<div id="sign_up_button"><%= f.submit "Submit answer" %></div>
<% end %>
<p><%= link_to "New Question", new_question_path %></p>
编辑:我的问题模型,如果它有用:
class Question
include MongoMapper::Document
key :question, String, :required => true
key :answer, String, :required => true
key :num, String, :required => true
答案 0 :(得分:1)
假设您正确地向我们提供了堆栈跟踪的摘录,您的问题是您没有在控制器中正确设置@question - 您尚未在上面发布。其他几个人在他们的回答中暗示了这一点,但我完全相信它。
您的测试 - 黄瓜或其他 - 与您遇到的问题无关。
我怀疑如果您访问root_url,您将遇到同样的问题 - 您将获得堆栈跟踪和错误。在不确切知道您的路线是什么的情况下,我无法确定您在访问root_url时的发送位置。
你的控制器应加载问题对象的@question(可能是通过Question.find()或类似的东西),然后渲染index.html.erb页面。所以你的控制器中的'索引'动作应该是你的@question中填充的东西。
请注意,您并未遵循其余的原则 - 通常人们会让'索引'为您提供事项列表(您的实例中的问题),然后ID会给您一个特定的问题。
我打赌,如果你去一个特定的问题,那就可以了。
也许你的问题是你不应该首先访问'root_path'进行测试?也许你应该去一个特定的“问题”路径?
答案 1 :(得分:0)
您对问题模型有任何验证吗?也许你无法像尝试一样创建新的问题对象。