Teardown在测试Capybara中间打电话

时间:2016-08-24 11:37:55

标签: ruby-on-rails capybara factory-bot minitest

我一直在尝试创建以下测试: 编辑模型(客户端),检查视图是否更新以及模型是否在数据库中更改。

有代码:

  test 'a' do
     user = User.joins(:organization_users).find_by organization_users: { role: OrganizationUser.roles.values_at(:ORGANIZER, :ADMINISTRATOR) } 

    sign_in_user user

    criterion = create(:criterion, scoring_id: @scoring.id, name: "Test criterion name", 
                        description: "Test description")
    step = create(:step, criterion_id: criterion.id)

    visit "scorings/" + (@scoring.id).to_s + "/criteria"

    find("#criteria > div > div > a > i").click()

    fill_in 'name', with: 'New name'
    fill_in 'description', with: 'New description'

    find('#criterion-modal > div:nth-child(2) > form > div:nth-child(4) > input').click()

    criterion = criterion.reload

    assert criterion.name == 'New name'

  end

` 司机:

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new app , { phantomjs: Phantomjs.path }
end
Capybara.javascript_driver = :poltergeist
Capybara.current_driver = Capybara.javascript_driver

拆解:

teardown do
  DatabaseCleaner.clean
  ActiveRecord::Base.connection.close
  Capybara.reset_sessions!
end

正如您在测试结束时所看到的那样,我重新加载了标准,但是当我这样做时,会调用拆解功能。之后,数据库被清理,我得到错误"无法找到标准ID:1"。我只使用minitest,工厂女孩和Capybara。所以我想要了解的是为什么Teardown被调用,因为它不是测试的结束,我该如何解决?

谢谢。

1 个答案:

答案 0 :(得分:0)

您没有显示您为拆解方法设置的内容,也没有指定您使用Capybara的驱动程序。但是,由于测试代码和拆卸都在同一个线程中运行,因此在测试结束之前切换无法进行拆卸。什么是可能的(当使用具有JS功能的驱动程序时,异步处理点击)是在应用程序代码处理/处理单击之前运行拆卸。这意味着无法找到标准ID:1"实际上将来自您的控制器代码。这样做的原因是你没有实际检查页面上的任何内容,以便在点击后进行更改,以便测试继续移动,完成(断言失败),拆卸清理并且控制器操作无法执行找到记录。像

这样的东西
assert_text 'Criterion updated' # if a message is displayed on successful update

assert_current_path("scorings/#{@scoring.id}") # whatever path it redirects to after updating
click之后和reload

之前

在旁注 - 使用长选择器,如'#criterion-modal> div:nth-​​child(2)>形式> div:nth-​​child(4)>输入'会导致真正脆弱的测试 - 如果可能的话,使用更简单的选择器或者capybara click_button类型的助手会更好