我们的测试套件有问题。
每当整个套件启动时,都会创建一个迷路记录。
每当我运行单个文件或规范上下文时,都不会创建此杂散记录。
我在spec_helper.rb中写了config.before(:each) { puts "COUNT = #{Model.count}\n" }
,无论测试运行的顺序如何,这条记录都会以某种方式持续存在。似乎在示例开始之前就已经开始了。
我们为我们的数据库播种,所以我尝试了一个干净的设置。
RAILS_ENV=test rake db:setup
RAILS_ENV=test rake db:seed
echo "Model.count" | rails c test
=> 0
然后每当我运行所有测试时(检查订单并检查before(:all)
)。
rspec
COUNT = 1
.
COUNT = 1
.
COUNT = 1
.
etc
我仔细检查了spec_helper.rb(RSpec2,pre rails_helper.rb),并且没有运气就注释掉了所有支持文件。
我怀疑此时的代码库,也许是某些奇怪的调用,有人留下了find_or_create
,一个奇怪的回调或其他东西,我不知道。
我想知道的是:
我添加了config.before(:suite) { debugger }
并且在此之前仍然创建了记录!
如何进一步细分此代码?
[23, 32] in /Users/yourname/.rvm/gems/ruby-1.9.3-p327@projectname/gems/rspec-core-2.14.6/lib/rspec/core/command_line.rb
23 @world.announce_filters
24
25 @configuration.reporter.report(@world.example_count, @configuration.randomize? ? @configuration.seed : nil) do |reporter|
26 begin
27 @configuration.run_hook(:before, :suite)
=> 28 @world.example_groups.ordered.map {|g| g.run(reporter)}.all? ? 0 : @configuration.failure_exit_code
29 ensure
30 @configuration.run_hook(:after, :suite)
31 end
32 end
(rdb:1) ModelName.count
1
答案 0 :(得分:2)
有关我如何找到持久记录的记录:
通过使用before(:suite) { debugger }
,我删除了记录并运行了整个测试套件,并注意到测试失败。
在此测试中,类似于以下内容:
context "blah" do
model = FactoryGirl.create(:model)
end
我只是将代码放在before(:each)
块中,测试正在通过,现在也是如此。
TIL:每当RSpec加载套件时,它会评估不在事务中的所有代码。这就是为什么我不能通过查看创建记录的时间来确定有问题的文件。