【问题标题】:Test for ActiveAdmin create/edit form - "Add New" record button for associated object测试 ActiveAdmin 创建/编辑表单 - 关联对象的“添加新”记录按钮
【发布时间】:2021-08-16 16:23:58
【问题描述】:

我有一个 ActiveAdmin 表单来创建一个新的 ActiveRecord 对象,并且该表单还能够为“主”模型的 has_many 关联之一创建记录,即:

class Car < ApplicationModel
  has_many :tires
end

class Tire < ApplicationModel
  belongs_to :car
end

# ... in ActiveAdmin "cars.rb" file...
ActiveAdmin.register Car do
  ...
  
  form do |f|
    f.semantic_errors
    f.inputs 'Car' do
      f.input :color
      f.input :doors, as: :number
      f.inputs do
        f.has_many :tires, allow_destroy: true, new_record: true do |t|
          t.input :type
          t.input :size
        end
      end
    end
    f.actions
  end
end

还有一些未在此处列出的控制器逻辑可以正确创建、编辑或销毁这些记录,包括 Cars 和 Tires。当表单呈现时(假设我正在创建一辆新车),底部有一个按钮,上面写着“添加新轮胎”。单击它会在页面上呈现一个子表单,其中包含两个字段:“类型”和“大小”。当我提交表单时,我已经设置了控制器来保存 Car 及其关联的轮胎。一切正常。

我正在努力进行自动化测试,以确保单击“添加新轮胎”按钮会导致子表单呈现。单击按钮后,我添加了一个断点并检查了page.body 以查看子表单是否存在,但它似乎不存在 - 我只看到按钮中的子表单模板(真的是a 元素)代码。这是我的测试代码中失败的部分:

click_link 'New Car'
fill_in('Color', with: 'Blue')
fill_in('Doors', with: 2)

click_link('Add New Tire') # Succeeds
fill_in('Type', with: 'All-Terrain') # Fails, can't find element

我尝试了其他方法来匹配第一个子表单字段,例如 xpath 和 css 选择器,但它无法找到该字段,就像我上面提到的那样,我没有看到如果我使用page.body 检查页面,则会呈现子表单。我被卡住了 - 谁能帮我弄清楚这里发生了什么?

【问题讨论】:

    标签: ruby-on-rails rspec capybara activeadmin


    【解决方案1】:

    我得到一个提示,将 js: true 添加到测试定义中可能会有所帮助,事实证明,它确实有效:

    RSpec.describe Car, js: true do
      ...
    end
    

    【讨论】:

    • 这是因为您的页面依赖于 JAvacript 将表单插入页面。默认驱动(机架测试)不支持 JS - 见github.com/teamcapybara/capybara#drivers
    • 是的,在发布此答案并找到解释后,我进行了更多研究。非常有意义,每当我单击“新轮胎”时,AA 都会使用 Javascript 来呈现 has_many 表单元素的副本。谢谢你的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2020-10-15
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多