Capybara + Webkit:如何测试客户端验证 - “必需”输入元素?

时间:2011-05-24 17:25:46

标签: ruby-on-rails html5 webkit rspec capybara

使用Rspec和Capybara,我正在尝试测试表单的失败验证,其中未填写“必需”输入,因此失败。理解HTML5的新导航员提供内置验证,我也理解Capybara也在使用它。之前,我正在使用

page.should have_error

这对我不起作用。

现在有人知道如何测试吗?

非常感谢!

大卫

4 个答案:

答案 0 :(得分:3)

HTML5客户端验证很难找到。我发现this帖子的答案很好。 代码是:

describe "when I leave required field empty" do
  it "I get an the correct html5 validation error" do
    #Leave the field empty
    click_on "Save" # or whichever button triggers the submit

    message = page.find("#field_id_attr").native.attribute("validationMessage")
    expect(message).to eq "Please fill out this field."
  end
end

基本上它的工作方式是field元素有一个名为“validationMessage”的属性,过程是:

  1. 点击提交 - 这会触发错误消息
  2. 获取对称为“validationMessage”的本机(html)属性(与Capybara页面对象属性相对)的引用。这将为您提供价值或信息本身。
  3. 断言该值符合预期。

答案 1 :(得分:2)

我对RSpec不熟悉所以我不确定have_error是什么。

你应该考虑一下你想要测试的内容。

您肯定不想测试每个浏览器特定的确切行为(显示什么消息以及如何显示)。

表示您要测试的内容,因为这不是浏览器所特有的,因此表单未提交。

例如,对于root的基本html表单,使用必需的单选按钮“我的值”。

# Check form can not be submitted without the radio button
visit '/'
click_button 'Submit'
assert_equal '/', current_path

# Check form can be submitted with the radio button
visit '/'
choose 'My value'
click_button 'Submit'
assert_equal '/next', current_path

您还应该考虑仅在您的html代码中测试required的存在,因为浏览器应该按预期工作(仅测试您的代码,而不是其他代码)

答案 2 :(得分:0)

如果有错误消息,您可以使用

page.should have_content("error")

这取决于您如何处理错误,以及您是否使用javascript。

答案 3 :(得分:-2)

这是一篇旧帖子,但我会尽力回答

have_error是webkit提供的方法,用于检查例如如果ajax请求或javascript一般正常运行

我用我的模型规格测试我的验证:

describe 'validations' do
   it { is_expected.to validate_presence_of :competitor_name }
   it { is_expected.to validate_presence_of :chassi }
   it { is_expected.to validate_presence_of :auction }
   it { is_expected.to validate_presence_of :car_template_id }
end  

或喜欢

expect(FactoryGirl.create(:customer)).to be_valid

检查我的工厂是否有效。

如果您需要通过定位无效输入来检查通知,则可以使用以下内容测试您的通知的html:

  it 'searches for specific order_car by chassi and model' do   
     visit order_cars_search_detailed_path
     fill_in 'order_car_chassi', with: '123456'
     select 'Octavia', from: 'order_car_car_template_car_template_id'
     click_button 'Search Order'

     expect(page).to have_content('THIS IS MY NOTICE')
     expect(page).to have_content('123456')
  end  

希望我能帮助其他人遇到这个问题。