我在这里需要帮助
我正在使用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 request
和feature
测试,只有失败的帖子(需要重新渲染表单)才会发生。在开发模式下,重新渲染变形效果很好。
我的测试
# 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' }
}
%>
一些观察:
birthdate
作为日期类型。有人遇到这个问题了吗?
任何其他信息,只需询问评论即可。
预先感谢!
发布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之前的日期时)。验证)。