Rails单元测试不会加载灯具

时间:2009-10-10 10:51:34

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

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

如果我通过rake db:fixtures:load RAILS_ENV=test手动加载灯具,则单元测试正常,但rake会清除测试数据库。

我的test_helper包含fixtures :all,我的测试继承自它 - 但是装置根本没有加载。

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

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

6 个答案:

答案 0 :(得分:5)

在测试类中调用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

答案 1 :(得分:5)

另一种方法是编写自己的自定义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

答案 2 :(得分:4)

我终于找到了问题,虽然解决方案有点像黑客。

一个插件依赖数据库中有一些数据,至少有一行。所以发生了什么:

  1. rake加载数据库架构
  2. rake尝试加载环境
  3. 环境包含插件
  4. 插件加载失败,因为缺少至少一行
  5. 没有加载灯具
  6. hacky解决方案是:将所需的数据直接放入模式中,而不是放入灯具中,因为它的加载时间较晚。

    我将搜索更方便的解决方案,如果找到答案,我会更新此答案。

答案 3 :(得分:0)

不确定您是否已经这样做,但是使用像ar_fixtures

这样的插件将测试数据从数据库导出到test / fixtures中的yml文件

答案 4 :(得分:0)

我遇到了同样的问题。或者更确切地说,问题是我的灯具不是数据库架构的最新版本。 rails只使用测试数据库作为后备解决方案,而不是抛出异常。最不受欢迎的。

答案 5 :(得分:0)

我的问题是忘了把“require'test_helper'”放在头上。 例如

require 'test_helper'

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