Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails在哪里存储通过在测试期间保存activerecord对象创建的数据?_Ruby On Rails_Ruby_Database_Rspec_Testing - Fatal编程技术网

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

Ruby on rails Rails在哪里存储通过在测试期间保存activerecord对象创建的数据?,ruby-on-rails,ruby,database,rspec,testing,Ruby On Rails,Ruby,Database,Rspec,Testing,Rails在哪里存储通过在测试期间保存activerecord对象创建的数据 我想我知道这个问题的答案:显然在\u测试数据库中。但看起来这不是真的 我使用此系统来测试rspec测试期间保存的ActiveRecord数据的情况: $rails-dMySQL测试 $cd测试 $nano config/database.yml 。。。创建mysql数据库测试,测试开发,测试生产 $script/生成rspec $script/generate rspec_model foo 编辑Foo迁移: clas

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

我想我知道这个问题的答案:显然在\u测试数据库中。但看起来这不是真的

我使用此系统来测试rspec测试期间保存的ActiveRecord数据的情况:

$rails-dMySQL测试

$cd测试

$nano config/database.yml

。。。创建mysql数据库测试,测试开发,测试生产

$script/生成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
类CreateFoos
$rake数据库:迁移

编辑等级库/模型/foo_等级库.rb:

self.use_transactional_fixtures = false
需要文件.expand_path(File.dirname(_文件)+'/../spec\u helper')) 描述福多 在…之前做 @有效的属性={ :bar=>12345 } 结束 它“应该在给定有效属性的情况下创建一个新实例” foo=foo.new(@valid_属性) foo.save 把“睡觉…” 睡眠(20) 结束 结束 $rake规格

当您看到“正在睡眠…”时,请切换到另一个打开的终端,并将mysql会话连接到test_test数据库,然后执行以下操作:

mysql>从foos中选择*; 空集(0.00秒)
为什么mysql会话在测试运行时不显示测试数据库中的任何记录?

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

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

但是,我相信如果您修改test/test_helper.rb文件,可以这样说:

self.use_transactional_fixtures = true
而不是

tail -f log/test.log
这将导致测试数据库中的数据持久化


另外:我的建议是专门针对Test::Unit设计的,而不是针对RSpec。但是,我认为您应该寻找的spec_helper.rb也有类似的设置。

您可以通过以下方法观察添加到测试数据库的记录:

当测试运行时,您应该会看到事务飞过。

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


因为它在交易中。如果关闭事务装置,测试运行速度将比以前慢得多。

非常感谢-您的建议奏效了。在每次测试之前清除数据库对我来说是清楚的。但是为什么mysql查询在测试运行时不显示数据库中的数据呢@马丁,从日志中我可以看到一个回滚正在发生。这与为什么在测试运行时数据不可见有关吗?数据库事务是隔离的,所做的更改只有在提交之前在事务的连接上可见。将其视为在数据库的不同副本中工作的每个事务。当它提交时,它会写入这些更改以供所有人查看。如果我的建议有效,你能选择我的答案作为这个问题的“选择答案”吗?谢谢:)谢谢,这个技巧很有用。