Rails 3.2.1、Ruby 1.9.3p125、rspec 2.8.0、rake 0.9.2.2
Rake::Task['namespace:task_name'].invoke 拒绝找到 namespace:task_name(namespace.rake 在 Rails.root/lib/tasks 中)。.execute - 相同。
所以,我在做
system 'RAILS_ENV=test bundle exec rake namespace:taskname'
这似乎有效,但 - 不使用测试数据库。
我有一个模块,并被告知在 Rails 框架中为它编写测试。我正在使用 rspec。我有一个从我的“沙盒”环境创建固定装置的食谱任务(“开发”在其他地方,我无法访问)。夹具已正确创建。
接下来,我尝试运行
system 'RAILS_ENV=test bundle exec rake db.fixtures.load FIXTURES=<fixture_list>'
我的测试数据库中没有数据;我只是假设它正在被加载回我的沙箱数据库中,这与它的派生位置相同。
我的模块的目的是检查数据库中的其他表,并且每天为 34 个提要中的每一个创建或不创建“提要状态”记录。是否创建记录取决于预定的时间表,“提要”是否遵守假期,星期几 - 许多标准差异很大,但由算法确定(这里有许多算法)。
我可以编写数百个测试来测试每个“提要”的每个可能结果,但是(a)我认为这是很多工作;(b) 它将无法维护(未来将添加更多“提要”);(c) 我仍在研究算法的启发式方法——总是会出现一些新的或我没有预料到的东西,并且 (d) 我担心我会恢复使用模块使用的相同算法,这些算法测试只有我的打字。
因此,计划是创建一个包含一年中所有日期 x 所有“提要”(34x366)的电子表格矩阵,并手动输入 0 或 1 以指示“提要”当天不应该或应该存在。是的,这有点工作,但是关注我的人会更愿意更改电子表格而不是 ruby 代码,并且任何差异都会出现。
因此,步骤是: 1. 准备空的测试数据库 2. 创建夹具(每次捕获对真实数据的更改) 3. 加载夹具 4. 运行模块一年的时间。5. 对于每个电子表格条目,将其与模块将创建或不会创建的记录相匹配。
但是 - 我被困在“加载固定装置”上。没有数据被加载到测试数据库中。
顺便说一句,调用模块
system 'RAILS_ENV=test bundle exec rake namespace:task_that_calls_module'
导致模块使用沙箱(当前环境)而不是测试数据库。
task_that_calls_module 也有 RAILS_ENV=test name_of_module_method_to_perform 并且仍然写入沙箱,而不是测试数据库。“沙盒”是我实际的开发环境。
Rails.root/spec/modules 中的 rspec 文件:
describe "MakeExpected" do
require 'rake'
before(:all) do
system "bundle exec rake testdb:extract_fixtures"
puts "extracted fixtures"
system "bundle exec rake db:test:load"
puts "db:test:load"
system 'RAILS_ENV=test bundle exec rake db:fixtures:load'
puts "loaded fixtures"
system("RAILS_ENV=test bundle exec rake testdb:run_make_expected --trace")
end # before
it "should be true" do
end # should be true
end # describe
Rails.root/lib/tasks/testdb.rake 中的 testdb:run_make_expected 任务:
task :run_make_expected => :environment do
include MakeExpected
RAILS_ENV=test test_scheduler
end # task do
在 before 块之后,将进行一些复杂的测试,将 db 与电子表格中的期望值进行比较。
请告诉我这是愚蠢而简单的事情吗?
哦 - bundle exec db rake 的东西是因为我没有 root 可以将 rake 安装到常规 bin 目录中。与 rspec 相同。我将整个事情称为:
bundle exec rspec spec/modules
其中这个 make_expected_spec.rb 是该目录中唯一的文件。我应该说
RAILS_ENV=test bundle exec rspec spec/modules
???