在我的Rails 4应用程序中以前通过Rspec测试时,这让我很烦恼。
之前,我测试了一个Rspec功能,通过表单和布尔值:all_or_nothing
创建一个Item。它过去了。因此,如果项目需要Date
和Time
参数,我需要标记需求。使用TDD,我让测试提示我何时将此功能添加到应用程序。当我在主题行中得到错误时就是这样。啊,我必须进行迁移才能将这两个字段添加到Item。完成。但我仍然得到这个错误。
嗯。 :all_or_nothing
的表单元素工作正常。我完全模仿了它,我想并且相信我仔细检查了simple_form_for
中两个新字段中的任何打字错误。我甚至在form_for
中重写了它,它仍然会产生同样的错误。如果我将:date
或:time
拉出,则无法在Item中找到该列。 Yanking两者,测试通过很好,但规格是失败。
作为现实检查,我可以通过网页执行此操作并找不到错误,表单按预期工作。因此,Rspec没有在Item中看到:date
或:time
字段。我试图帮助Rspec在:css
内找到它,但这并没有起作用。我重新运行迁移,但如果我还没有运行迁移,那么通过浏览器进行的冒烟测试将无法运行。
谷歌搜索这条消息并没有指出我需要的线索。来自Rspec的错误是在这种形式下有一个未定义的方法' date'对于此项目,它才能打开表格。我无法理解为什么它在模型中没有看到它。我尝试过更改标签的其他组合,但仍然是同样的错误。帮助我看看我无法看到的内容。
spec / feature / item / item_create_spec.rb第32,26行
require 'spec_helper'
feature "create items" do
background do
@attr = {
:name => "Cashiers are physically counting?",
:category => "Cash",
:sub_category => "Video Review",
:explanation => "Floors and aisles are clear",
:scoring => 7,
:high_score => 10,
:all_or_nothing => true,
:date => "1/1/2011",
:time => "4:59 PM"
}
context "in inspections" do
background do
@inspection = FactoryGirl.create(:inspection)
end
scenario "can create an item" do
visit root_path
expect{
click_link "New Item"
fill_in 'High score', with: @attr[:high_score]
check 'All or nothing', :checked
# check 'Date?', :checked
within(:css, "#item_date") do
check 'Date?', :checked
end
check 'Time?', :checked
save_and_open_page
click_button 'Create item'
}.to change(Item, :count).by(1)
end
end
end
_form.html.erb第9,10行
<%= simple_form_for @item do |f| %>
<%= f.input :category %>
<%= f.input :name %>
<%= f.input :sub_category %>
<%= f.input :explanation %>
<%= f.input :scoring %>
<%= f.input :high_score %>
<%= f.input :all_or_nothing, as: :boolean, checked_value: true, unchecked_value: false %>
<%= f.input :date, as: :boolean, checked_value: true, unchecked_value: false %>
<%= f.input :time, as: :boolean, checked_value: true, unchecked_value: false %>
<%= f.button :submit %>
<% end %>
schema.rb的相关部分
create_table "items", force: true do |t|
t.string "category"
t.string "sub_category"
t.string "name"
t.string "explanation"
t.integer "scoring"
t.integer "high_score"
t.boolean "all_or_nothing"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "survey_id"
t.boolean "date"
t.boolean "time"
end
add_date_to_items.rb
class AddDateToItems < ActiveRecord::Migration
def change
add_column :items, :date, :boolean
add_column :items, :time, :boolean
end
end
html输出片段
<div class="input boolean optional item_date">
<input name="item[date]" type="hidden" value="false">
<label class="boolean optional control-label checkbox" for="item_date">
<input class="boolean optional" id="item_date" name="item[date]" type="checkbox" value="true">
Date</label>
</div>
如果更清楚的话,这里有一个要点:
答案 0 :(得分:3)
据我了解您的问题,您在date
表格中创建了两个新字段time
和items
。成功地完成了migration
,在development
环境中一切正常。
但是 test
环境不一样。您的测试失败,错误为undefined method 'date' for Item
。
这只是让我得出结论,您已在development
环境而非test
环境中运行迁移。
我建议您使用run following命令在test
环境中执行任何挂起的迁移:
rake db:migrate RAILS_ENV=test
在此之后运行示例。