Rails date_select未定义的方法字符串

时间:2018-08-07 12:47:21

标签: ruby-on-rails rspec

我在这里需要帮助

我正在使用Rails的date_select帮助程序,格式为%d/%m/%Y,以获取日期。助手似乎在开发中可以正常工作,但不能在测试模式下使用。

在测试模式下,POST失败时出现错误/错误,并且测试需要重新呈现视图。我收到以下失败/错误消息:

Failure/Error: <%= f.date_select :birthdate,

ActionView::Template::Error:
   undefined method `year' for "{3=>15, 2=>6, 1=>2001}":String

或者,取决于我格式化日期的方式

ActionView::Template::Error:   
   undefined method `year' for "15/06/2001":String

对于rspec requestfeature测试,只有失败的帖子(需要重新渲染表单)才会发生。在开发模式下,重新渲染变形效果很好。

我的测试

# feature test 
it "sign up with false credential" do
  users = FactoryBot.attributes_for(:users)

  visit 'users/sign_up'
  fill_in 'user_name', :with => "test"
  find_by_id('user_birthdate_3i').find("option[value='15']").select_option
  find_by_id('user_birthdate_2i').find("option[value='6']").select_option
  find_by_id('user_birthdate_1i').find("option[value='2001']").select_option

  click_button('Save')
  expect(page).to have_selector "#error_explanation"
end

# request test
it "signs usuario_candidato up with wrong attributes" do
  users = FactoryBot.attributes_for(:users)
  expect{ post user_registration_path,
    :params => {
      "user" => {
        "name" => user[:name],
        "birthdate" => "2018/12/31"
      }
    }
  }.to change{ User.count }.by(0)
end

表格

<%= f.date_select :birthdate,
  options = {
    start_year: Date.current.year,
    end_year: 1950,
    order: [:day, :month, :year],
    prompt: { day: 'day', month: 'month', year: 'year' }
  }
%>

一些观察:

  • 当是时,相同的测试格式适用于功能和请求 成功的帖子。
  • 我正在使用语言环境PT-BR,默认格式为%d /%m / Y%
  • 我正在使用Postgres,并将birthdate作为日期类型。
  • 我正在将Devise控制器用于这种形式,但没有覆盖控制器的操作。
  • 正如我已经说过的,开发模式不会重现此错误。
  • 我在发布之前已经尝试了不同的日期格式(例如%m /%d%/%Y或年/月/日),它总是返回相同的错误。因此,我对该问题的建议是:发布失败后,当它应该是Date类时,返回的是String。

有人遇到这个问题了吗?
任何其他信息,只需询问评论即可。 预先感谢!

更新

发布6天后,我正在尝试有人提出评论的建议,并且碰巧测试通过了,没有提出任何错误。我没有提出建议,只是从text_field更改为date_field(因为我无法使用date_field,所以我更改为text_field并移至解决下一个问题。

我发现Rails与日期的工作方式存在一定的不一致。在问题第一次提出之前,它已经正常通过了测试。然后发生了错误,现在不再发生了。

我在模型中用于验证日期的正则表达式也有类似的问题:

型号

# dd/mm/yyyy
VALID_DATE = /\A[0-9]{2}\/[0-9]{2}\/[0-9]{4}\z/

validates :birthdate, presence: true, format: { with: VALID_DATE, message: "must be in the format DD/MM/YYYY" }

当我创建验证时,它可以正常工作。使用的格式为yyyy-mm-dd的值不能通过模型​​测试。第二天,Rspec开始引发错误,指出yyyy-mm-dd和其他字符应该有效(因此,忽略了正则表达式验证)

模型测试错误

User birthdate should be invalid
 Failure/Error: expect(user).to_not be_valid
  expected #<User id: nil, name: "Sra. Margarida Sophie Santana", birthdate: "2000-12-29", created_at: nil, updated_at: nil> not to be valid

我唯一需要额外的日期信息是config / initializer中的date_formats.rb,其值如下:

Date::DATE_FORMATS[:default] = "%d/%m/%Y"

我已经很久了。

当Rails决定将字符串值转换为日期值时,显然会发生变化(当它通过正则表达式验证测试时,它将日期作为字符串传递,当问题引起日期从string转换为date之前的日期时)。验证)。

0 个答案:

没有答案