ruby-on-rails – 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

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的>从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设置.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...