我有两个失败的测试,目前令我困惑。他们正在测试新会议的表单是否正确保存到数据库中。该行为在浏览器中起作用。这些测试正在测试通过两条不同路线进入会议/新页面的情况。由于“会议”属于“组织”,因此可以从会议索引页面(路由是new_admin_conference_path)并通过组织显示页面(其中路由是new_admin_organization_conference_path(org))添加新会议。Rails 4 minitest Object.last返回错误的结果,尽管object.save传球
测试:
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)。
我已经完成了save_and_open_page,每次测试都在click_button'Save'后,页面分别正确加载到'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
对于被彻底,路由着想。 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')。最后得到了相同的结果,并且由于它是一个Rails 3 ActiveRecord错误,这令人沮丧地不是正确的方向。
可疑的是,在每个assert_difference方法之前和之后打印'Conference.last.name'时,尽管'RailsConf'和'EmberConf'被成功保存,但它会同时打印'Conference1'。
这是怎么回事?
另注
这些测试通过当我第一次写了他们。自从编写更多代码(主要是展示和索引页面上的前端内容,与这里处理的功能很少)之后,它们才失败了。我通过将表单上的“提交”更改为“保存”,打破了一系列测试,并修复了这两个看似无关的失败,这些失败令人费解,令人沮丧。