我一直在尝试创建以下测试: 编辑模型(客户端),检查视图是否更新以及模型是否在数据库中更改。
有代码:
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被调用,因为它不是测试的结束,我该如何解决?
谢谢。
答案 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类型的助手会更好