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

Ric*_*aca 6 ruby database testing rspec ruby-on-rails

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

edit spec/models/foo_spec.rb:

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe Foo do
  before(:each) do
    @valid_attributes = {
      :bar => 12345
    }
  end

  it "should create a new instance given valid attributes" do
    foo = Foo.new(@valid_attributes)
    foo.save
    puts "sleeping..."
    sleep(20)
  end
end

$ rake spec

当您看到"正在..."时,更改为另一个打开的终端,其中一个mysql会话连接到test_test数据库并执行:

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

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

Der*_* P. 13

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

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

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

self.use_transactional_fixtures = false
Run Code Online (Sandbox Code Playgroud)

代替

self.use_transactional_fixtures = true
Run Code Online (Sandbox Code Playgroud)

它将导致测试数据库中的数据持久存在.

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