Rspec:ActionView :: Template :: Error:项目的未定义方法'date'

时间:2014-04-02 19:52:33

标签: ruby-on-rails ruby-on-rails-4 rspec rspec-rails

在我的Rails 4应用程序中以前通过Rspec测试时,这让我很烦恼。

之前,我测试了一个Rspec功能,通过表单和布尔值:all_or_nothing创建一个Item。它过去了。因此,如果项目需要DateTime参数,我需要标记需求。使用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>

如果更清楚的话,这里有一个要点:

https://gist.github.com/sam452/9942221

1 个答案:

答案 0 :(得分:3)

据我了解您的问题,您在date表格中创建了两个新字段timeitems。成功地完成了migration,在development环境中一切正常。

但是 test环境不一样。您的测试失败,错误为undefined method 'date' for Item

这只是让我得出结论,您已在development环境而非test环境中运行迁移。

我建议您使用run following命令在test环境中执行任何挂起的迁移:

rake db:migrate RAILS_ENV=test

在此之后运行示例。