【问题标题】:Rails 4 minitest Object.last returning wrong result despite object.save passingRails 4 minitest Object.last 返回错误结果,尽管 object.save 通过
【发布时间】: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


    【解决方案1】:

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

    检查您的对象的 default_scope,因为根据传递 assert_difference,记录似乎正在正确保存。

    【讨论】:

      猜你喜欢
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多