1

我有两个失败的测试,目前令我困惑。他们正在测试新会议的表单是否正确保存到数据库中。该行为在浏览器中起作用。这些测试正在测试通过两条不同路线进入会议/新页面的情况。由于“会议”属于“组织”,因此可以从会议索引页面(路由是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'。

这是怎么回事?

另注

这些测试通过当我第一次写了他们。自从编写更多代码(主要是展示和索引页面上的前端内容,与这里处理的功能很少)之后,它们才失败了。我通过将表单上的“提交”更改为“保存”,打破了一系列测试,并修复了这两个看似无关的失败,这些失败令人费解,令人沮丧。

回答

0

assert_difference测试正在通过,只是与Conference.last {field}的数据比较失败。

检查您的对象的default_scope,因为该记录似乎基于传递assert_difference正确保存。