如何构建失败的测试?测试通过但Rails服务器说:'未初始化的常量'

时间:2013-10-31 11:04:03

标签: ruby-on-rails testing ruby-on-rails-4 minitest

这可能与“Inconsistent behavior when referencing constants inside a module”类似,但我不确定。

我的情况是我的测试工作但我的应用程序失败了,虽然我可以修复应用程序,但我宁愿让测试失败,如果该应用程序确实如此!

以下是基本设置:

admin_controller.rb (与ApplicationController一样,其他控制器继承)

class AdminController < ActionController::Base

  # If a session_grouping is set, it should be used until unset.
  def session_grouping
    session[:default_grouping] || DraftGrouping.new
  end

  ...

end

admin_controller_test.rb

require 'test_helper'
class AdminControllerTest < ActionController::TestCase

  def test_get_session_grouping
    assert_equal DraftGrouping, @controller.session_grouping.class, 'without a grouping set, a draft grouping should be returned'
  end

  ...

end

此测试(以及为清晰起见而排除的其他测试)全部通过DraftGrouping定义如下:

grouping.rb

class Grouping < ActiveRecord::Base
  ...
end

# Used as a stand-in for a real grouping until there is something to save.
class DraftGrouping

  # Any call to real_grouping instantiates the grouping in the database.
  def real_grouping
    @real_grouping || @real_grouping = Grouping.create!
  end

  ...

end

但是,在应用程序中使用时,AdminController#session_grouping失败并显示消息NameError (uninitialized constant AdminController::DraftGrouping): app/controllers/admin_controller.rb:5:in session_grouping'`

我可以通过在DraftGrouping内定义Grouping并在任何地方调用Grouping::DraftGrouping来解决所有问题。实际上,无论如何,这是一种更清晰的做事方式,所以我很乐意这样做。但是我该如何为此建立一个失败的测试呢?

1 个答案:

答案 0 :(得分:1)

您是否在DraftGrouping内指定了grouping.rb?看起来您可能来自您的代码示例。

如果是这样,当试图在admin_controller.rb中实例化它时,Rails的自动加载例程可能无法找到它。如果他们已经引用Grouping(因此已经加载了grouping.rb,因此加载了DraftGrouping的定义),您的测试可能会通过。

我要尝试的第一件事就是将草案组的定义移到draft_grouping.rb