经过重大故障排除后,我发现我需要运行rake spec一次(我可以使用control-c中止),然后才能直接运行rspec(例如,在我们规范的子集上).我们正在运行Rails 3.0.7和RSpec 2.5.0.
显然,rake正在运行一些重要的数据库设置任务/代码(我们在根级别Rakefile和其他地方都有自定义代码).
如何在不运行的情况下运行rake测试数据库设置任务/代码rake spec?
除了能够在一个文件子集上运行rspec之外,我还使用specjour在多个核心上传播我们的规范(尚未成功将它们传播到局域网中),但我看到了与运行rspec相同的行为直接:我需要rake spec在specjour工作之前在每个测试数据库上运行(假设有两个核心):
rake spec TEST_ENV_NUMBER=1
control-c (after tests start)
rake spec TEST_ENV_NUMBER=2
control-c (after tests start)
specjour
Run Code Online (Sandbox Code Playgroud)
注意:我的config/database.yml有这个测试条目(对于并行测试宝石来说很常见):
test:
adapter: postgresql
encoding: unicode
database: test<%=ENV['TEST_ENV_NUMBER']%>
username: user
password:
Run Code Online (Sandbox Code Playgroud)
parallel_tests似乎正确设置了它的数据库,但我们的许多规范都失败了.
我还应该提一下,运行specjour prepare会导致Postgres记录它无法找到数据库的错误,但它会创建它们(没有表).在后续运行中,不会记录任何错误,也不会创建任何表.我的整个问题可能只是一个错误prepare,所以我在github上报告了它.
我认为我可以通过设置Specjour::Configuration.prepare.specjour/hooks.rb 在每个specjour测试数据库上运行任意代码,所以如果有任何rake任务或我需要运行的其他代码,它可能在那里工作.
我的项目中有两个表具有几乎相同的结构,其中一个用于计算用户统计信息,另一个表从未用于此.现在我需要使用它们来计算统计数据.
我使用MySQL Views做到了这一点,除了我的测试,一切都很顺利.似乎数据库清理程序策略不会将数据保存在数据库中,并且我的视图从未被填充.
我从移动的策略:transaction来:truncation和数据开始被持久化.但我仍然有问题,我继续无法从视图中读取数据.
# spec/spec_helper.rb
config.before(:each, using_view: true) do
DatabaseCleaner.strategy = :truncation
end
# spec/models/stats/answer.rb
describe 'POC test', using_view: true do
it 'works fine without the table view' do
expect{ create(:answer) }.to change{ Answer.count }
expect{ create(:knowledge_answer) }.to change{ Knowledge::Answer.count }
end
it 'works fine with the table view' do
expect{ create(:answer) }.to change{ Stats::Answers.count }
expect{ create(:knowledge_answer) }.to change{ Stats::Answers.count }
end
end
Run Code Online (Sandbox Code Playgroud)
当我执行它时:
Stats::Answers
POC test
works fine with the table view (FAILED …Run Code Online (Sandbox Code Playgroud) 我正在使用 rspec 进行测试,我注意到在运行测试后,它有时会在测试数据库中留下一些记录。我不知道为什么。我在我的配置文件中将 use_transactional_fixtures 设置为 true。但是直到我手动删除记录它们才会消失。有没有人有办法阻止这种情况?
编辑; 在我说只有当测试失败时。事实并非如此。