经过重大的故障排除,我发现我需要运行rake spec次(我可以使用control-c中止),然后才能直接运行rspec(例如,在我们规范的子集上).我们正在运行Rails 3.0.7和RSpec 2.5.0.

显然,rake正在运行一些重要的数据库设置任务/代码(我们在根级别的rails Rakefile和其他地方都有自定义代码).

How can I run the rake test database setup tasks / code without running 100?

除了能够在一部分文件上运行rspec,我还使用specjour在多个核心之间传播我们的规范(还没有成功地在LAN中传播它们),但我看到了与直接运行rspec相同的行为:在specjour工作之前,我需要在每个测试数据库上运行rake spec(假设有两个核心):

rake spec TEST_ENV_NUMBER=1
control-c (after tests start)
rake spec TEST_ENV_NUMBER=2
control-c (after tests start)
specjour

注意:我的配置/数据库.yml有这个测试条目(这在并行测试GEM中很常见):

test:
  adapter: postgresql
  encoding: unicode
  database: test<%=ENV['TEST_ENV_NUMBER']%>
  username: user
  password:

parallel_tests似乎正确设置了数据库,但我们的许多规范都失败了.

我还应该提到,运行specjour prepare会导致Postgres记录错误,因为它找不到数据库,但会创建它们(没有表).在后续运行中,不会记录任何错误,但也不会创建任何表.我的整个问题可能只是prepare中的一个bug,所以我在github上报告了它.

我认为我可以在每个specjour测试数据库上运行任意代码,只需在中设置Specjour::Configuration.prepare.规格/挂钩.rb,所以如果我需要运行任何rake任务或其他代码,它可能会在那里工作.

推荐答案

我在工作中设置CI系统时遇到了类似的问题,所以我逐渐建立了一个系统来处理这个问题.这可能不是最好的解决方案,但在我的情况下它对我有效,我一直在寻找更好的方法来做事情.

我有一个测试数据库,我需要设置,但也需要加载种子数据,以便我们的测试工作.

对rake任务进行故障排除的基础是使用--trace选项运行rake,以查看引擎盖下发生了什么.当我这么做的时候,我发现运行rake spec做了很多事情,我可以在定制的rake任务中复制(或根据我认为合适的方式进行修改).

下面是我们所做工作的一个例子.

desc "Setup test database - drops, loads schema, migrates and seeds the test db"
task :test_db_setup => [:pre_reqs] do
  Rails.env = ENV['RAILS_ENV'] = 'test'
  Rake::Task['db:drop'].invoke
  Rake::Task['db:create'].invoke
  result = capture_stdout { Rake::Task['db:schema:load'].invoke }
  File.open(File.join(ENV['CC_BUILD_ARTIFACTS'] || 'log', 'schema-load.log'), 'w') { |f| f.write(result) }
  Rake::Task['db:seed:load'].invoke
  ActiveRecord::Base.establish_connection
  Rake::Task['db:migrate'].invoke
end

这只是一个示例,并且特定于我们的情况,所以您需要弄清楚需要做些什么来设置测试数据库,但是使用rake的--trace选项很容易确定.

此外,如果您发现测试设置花费的时间太长(在我们的例子中就是这样),您还可以将数据库转储到.sql格式,并让测试数据库将其直接导入mysql进行加载.这样我们就节省了几分钟的测试数据库设置时间.我在这里不展示它,因为它会使事情变得非常复杂——它需要正确地生成,而不会过时,等等.

Ruby-on-rails相关问答推荐

使用带有 Paper Trail gem 的子类

刺激不添加侦听器以搜索表单输入

Rails 100% 新手问题 - send() 方法

Ruby - ActiveRecord::ConnectionNotEstablished

在一行中更改多个对象属性

如何让 Rspec 运行嵌套在文件夹下的所有测试?

价格字段的字符串、小数或浮点数据类型?

如何在 Rails 迁移中添加判断约束?

Rails:参数太少

如何按值按降序对哈希进行排序并在 ruby​​ 中输出哈希?

在 where 查询中查找 nil has_one 关联

如何从邮箱中获取域

Rails 3 SSL 路由从 https 重定向到 http

Rails - 具有空数组的强参数

设计/Rails - 如何删除特定的 Flash 消息? (登录成功)

has_many :通过 class_name 和 foreign_key

Heroku - 在浏览器中显示当前提交的哈希

在 Ruby on Rails 中的控制器中获取 URL 的锚部分

Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务?

如何获取 Rails 3.1 中assets资源 的绝对 URL?