Rails在哪里存储通过在测试期间保存activerecord对象而创建的数据?

Rails在哪里存储通过在测试期间保存activerecord对象而创建的数据?

我以为我知道这个问题的答案:显然在_test数据库中 。 但看起来这不是真的

我使用这个系统来测试在rspec测试期间保存的ActiveRecord数据发生了什么:

$ rails -d mysql test

$ cd测试

$ nano config / database.yml …

…创建mysql数据库test_test,test_development,test_production

$ script / generate rspec

$ script / generate rspec_model foo

编辑Foo迁移:

 class CreateFoos 

$ rake db:migrate

编辑spec / models / foo_spec.rb:

需要File.expand_path(File.dirname(__ FILE__)+'/../spec_helper')

描述Foo做
  之前(:每个)做
     @valid_attributes = {
       :bar => 12345
     }
  结束

  它“应该创建一个给定有效属性的新实例”
     foo = Foo.new(@valid_attributes)
     foo.save
    把“睡觉......”
    睡眠(20)
  结束
结束

$ rake spec

当您看到“正在...”时,请切换到另一个带有连接到test_test数据库的mysql会话的打开终端并执行:

mysql> select * from foos;
空集(0.00秒)

为什么mysql会话在测试运行时不显示test_test数据库中的任何记录?

默认情况下,在每次测试运行后,设计都会删除测试数据库中的项目。 这样做是为了确保您的每个测试都有自己的沙箱,这样就不会导致与之前的测试发生任何交互。

再次,这是设计的。 您不希望测试操作同一组数据(或依赖于同步执行),因为无法保证执行顺序。

但是,我相信如果你修改test / test_helper.rb文件来说这个:

self.use_transactional_fixtures = false 

代替

 self.use_transactional_fixtures = true 

它将导致测试数据库中的数据保持不变。

另外:我的建议是专门设计用于Test :: Unit,而不是RSpec。 但是,我想你应该寻找类似的spec_helper.rb设置。

“但是为什么mysql查询在测试运行时没有显示数据库中的数据?”

因为它在交易中。 如果您关闭事务性灯具,您的测试运行速度会比之前慢得多。

您可以观察添加到测试数据库的记录:

 tail -f log/test.log 

在测试运行时,您应该看到飞行的交易。