【问题标题】:Rails unit testing doesn't load fixturesRails 单元测试不加载夹具
【发布时间】:2009-10-10 10:51:34
【问题描述】:

rake test:units 在我当前的应用程序中失败,因为缺少所需的灯具数据。

如果我通过 rake db:fixtures:load RAILS_ENV=test 手动加载固定装置,则单元测试正在运行,但 rake 会清除测试数据库。

我的 test_helper 包含 fixtures :all 并且我的测试从它继承 - 但夹具根本没有加载。

我现在有点无能为力,真的需要一些帮助!

我尝试了很多,我认为这与这个项目中使用的一些环境设置或插件有关。有谁知道在哪里可以了解为测试环境加载了哪些文件?

【问题讨论】:

  • 对于它的价值,我遇到了类似的问题,除了我定义了一个依赖于数据库记录的常量。将该常量移至实例变量和 booya。看起来常量在加载固定装置之前就已经定义好了。干杯。

标签: ruby-on-rails unit-testing fixtures


【解决方案1】:

在您的测试类中调用fixtures :all,而不是超类(test_helper)。我的猜测是超类的初始化没有按照您期望的方式工作,并且不会调用 fixtures :all。也许尝试将调用放在 test_helper 的初始化方法中。

我的test/test_helper.rb 看起来像这样:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

【讨论】:

  • 嗨 cstump,我尝试将fixtures :all 直接放在我的测试类中,但没有成功。似乎通话没有任何效果 - 但我无法想象为什么!
  • +1:这对我有用,我喜欢这个解决方案,因为它是本地化和明确的。在这种情况下,fixtures :users 内的 UsersControllerTest 就足够了。
【解决方案2】:

另一种方法是编写自己的自定义 rake 任务进行测试。

例如:


task :test_units do

  RAILS_ENV = 'test' # Force the environment to test

  puts "Recreate the test database"
  Rake::Task['db:test:prepare'].invoke

  puts "Seed the database with fixtures"
  Rake::Task['db:fixtures:load'].invoke

  puts "Executing Unit Tests"
  Rake::Task['test:units'].prerequisites.clear 
  Rake::Task['test:units'].invoke
end

【讨论】:

  • 这对我有用,+1。唯一的区别是我必须将RAILS_ENV = 'test' 放在db:test:prepare 之后,否则Sqlite3 会失败并出现错误提示我没有清除测试数据库的正确权限。
【解决方案3】:

我终于找到了问题所在,虽然解决方案有点老套。

一个插件依赖于数据库中有一些数据,至少一行。所以发生的事情是:

  1. rake 加载数据库架构
  2. rake 尝试加载环境
  3. 环境包括插件
  4. 插件加载失败,因为缺少至少一行
  5. 没有加载任何装置

hacky 的解决方案是:将所需的数据直接放入架构而不是固定装置,因为它加载到较晚。

我会寻找一个更方便的解决方案,如果我找到了,我会更新这个答案。

【讨论】:

  • 插件不应该做这样的事情。最好的办法是修复插件并在 github 上向他们发送拉取请求。
  • 我在插件中修复了这个问题,并将很快提交补丁。 ;)
【解决方案4】:

我的问题是忘记将“require 'test_helper'”放在首位。 例如。

require 'test_helper'

class AdminUserTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
end

【讨论】:

    【解决方案5】:

    我遇到了同样的问题。或者更确切地说,问题在于我的固定装置与数据库模式不是最新的。 Rails 没有抛出异常,而是将测试数据库用作后备解决方案。最不确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2015-03-18
      • 2011-06-07
      • 1970-01-01
      相关资源
      最近更新 更多