【发布时间】:2014-10-11 16:02:16
【问题描述】:
我有两个失败的测试目前让我感到困惑。他们正在测试新会议的表格是否正确保存到数据库中。该行为在浏览器中有效。这些测试通过两种不同的路径测试对会议/新页面的访问。由于“会议”属于“组织”,因此可以从会议索引页面(路径为 new_admin_conference_path)和组织展示页面(路径为 new_admin_organization_conference_path(org))添加新会议。
测试:
test "admin can create a conference through new_admin_conference_path" do
sign_in_admin
visit new_admin_conference_path
fill_in 'Name', :with => 'RailsConf'
select(organizations(:valid_org).name, :from => 'conference_organization_id')
assert_difference('Conference.count', 1) do
click_button 'Save'
end
assert_equal 'RailsConf', Conference.last.name, "field 'name' did not save to database"
assert_equal organizations(:valid_org).id, Conference.last.organization_id, "field 'organization_id' did not save to database"
end
test "admin can create a conference through new_admin_organization_conference_path" do
sign_in_admin
visit new_admin_organization_conference_path(organizations(:valid_org))
fill_in 'Name', :with => 'EmberConf'
assert_difference('Conference.count', 1) do
click_button 'Save'
end
assert_equal 'EmberConf', Conference.last.name, "field 'name' did not save to database"
assert_equal organizations(:valid_org).id, Conference.last.organization_id, "field 'organization_id' did not save to database"
end
他们的消息失败了:
1) Failure:
AdminUserFlowsTest#test_admin_can_create_a_conference_through_new_admin_conference_path [/Users/wendybeth/projects/confreaks/tv3/test/integration/admin_user_flows_test.rb:141]:
field 'name' did not save to database.
Expected: "RailsConf"
Actual: "Conference1"
2) Failure:
AdminUserFlowsTest#test_admin_can_create_a_conference_through_new_admin_organization_conference_path [/Users/wendybeth/projects/confreaks/tv3/test/integration/admin_user_flows_test.rb:156]:
field 'name' did not save to database.
Expected: "EmberConf"
Actual: "Conference1"
209 runs, 474 assertions, 2 failures, 0 errors, 0 skips
其中“Conference1”是夹具会议的名称(:valid_conf)。但是,两者都通过了 assert_difference('Conference.count', 1) 。我在 click_button 保存之前和之后都将 Conference.count 打印到屏幕上,它是正确的(两个测试分别为 1 和 2)。
我在每次测试的 click_button 'Save' 后都完成了 save_and_open_page,并且页面分别在 'RailsConf' 显示页面和 'EmberConf' 显示页面正确加载,每个页面都有相应的“会议已成功保存”通知.
我对与会议相关的事件和与事件相关的视频有类似的测试和功能 - 这些测试都通过了。我的想法是,这可能与测试数据库很奇怪有关......我在测试文件的开头使用了 DatabaseCleaner:
before :each do
DatabaseCleaner.start
end
after :each do
DatabaseCleaner.clean
if page.has_content?('Sign Out')
click_link 'Sign Out'
end
end
为了彻底,routes.rb 文件:
namespace :admin do
...
resources :organizations do
resources :conferences
end
resources :conferences
...
end
“...”代表不相关的路线。
会议新增和创建方法(使用action_args):
def new organization_id = nil
@conference = Conference.new(organization_id: organization_id)
end
def create
@conference = Conference.new(conference_params)
if @conference.save
flash[:notice] = "'#{@conference.name}' has been created."
redirect_to admin_conference_path(@conference)
else
flash[:error] = "Unable to create the conference at this time."
render action: 'new', id: @conference
end
end
我找到的唯一半相关的搜索结果在这里:
Rails 3 "last" method is returning incorrect result from ActiveRecord output
不过,我使用的是 Rails 4。我已经尝试过 Conference.order('created_at').last 并获得相同的结果,但由于它是 Rails 3 ActiveRecord 错误,因此方向不正确,令人沮丧。
正如怀疑的那样,在每个 assert_difference 方法之前和之后打印“Conference.last.name”时,尽管成功保存了“RailsConf”和“EmberConf”,但它两次都打印了“Conference1”。
这到底是怎么回事?
另一个说明
这些测试在我第一次编写时就通过了。只是在编写更多代码(主要是显示和索引页面上的前端内容,与这里处理的功能几乎没有关系)之后,他们才失败了。我通过将表单上的“提交”更改为“保存”来打破了一系列测试,并且在修复这个问题时遇到了这两个看似无关的失败,它们既令人困惑又令人沮丧。
【问题讨论】:
标签: activerecord ruby-on-rails-4 integration-testing minitest