2009-10-10 58 views
9

rake test:units在我当前的应用程序中失败,因为缺少灯具所需的数据。Rails单元测试不会加载灯具

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

我的test_helper包括fixtures :all和我的测试是从它继承 - 但灯具根本没有加载。

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

感谢和再见,

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

+1

对于它的价值,我遇到了类似的问题,除了我定义了一个依赖于数据库记录的常量。将该常量移至实例变量和booya。看起来好像常量在Fixtures被加载之前被定义。干杯。 – 2011-03-01 19:35:28

回答

3

我终于发现了问题,虽然解决方案是一种哈克。

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

  1. 耙负载的数据库模式
  2. 耙尝试加载环境
  3. 环境包括插件
  4. 插件加载失败,因为缺少至少一行
  5. 没有固定装置装载

hacky的解决方案是:将所需的数据直接放入模式中,而不是放入夹具中,因为它的加载时间较晚。

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

+3

插件不应该这样做。最好的办法是修复插件并在github上向他们发送pull请求。 – 2009-10-21 04:18:15

+0

我在插件中解决了这个问题,很快就会提交补丁。 ;) – xijo 2009-10-21 07:37:00

0

不知道如果你已经这样做,而是从数据库中使用像ar_fixtures

+0

嗯,问题是从数据库中获取数据,我认为ar_fixtures是相反的! :) – xijo 2009-10-10 18:07:28

+0

哦oops :)对不起,误读了这个问题 – Jen 2009-10-10 19:30:47

5

插件在您的测试类导出测试数据的YML文件的测试/夹具将调用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 
+0

您好cstump,我试着把'fixtures:all'直接放在我的测试类中,但它没有工作。似乎这个电话没有任何影响 - 但我无法想象为什么! – xijo 2009-10-10 18:03:27

+0

+1:这对我很有用,我喜欢这个解决方案,因为它是本地化的和明确的。在这种情况下'UsersControllerTest'中的'fixture:users'就足够了。 – Johnsyweb 2013-05-11 09:42:52

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 

+0

这对我有效,+1。唯一的区别是我必须在'db:test:prepare'之后加上'RAILS_ENV ='test'',否则Sqlite3会失败,并显示错误,说我没有清除测试数据库的正确权限。 – 2012-05-21 19:39:50

0

我有同样的问题。或者说,问题在于我的灯具与数据库模式不兼容。而不是抛出异常,Rails只是使用测试数据库作为后备解决方案。最有可能的。

0

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

require 'test_helper' 

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