7

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

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

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

$ rails -d mysql 测试

$ cd 测试

$ 纳米配置/database.yml ...

... 创建 mysql 数据库 test_test、test_development、test_production

$ 脚本/生成 rspec

$ 脚本/生成 rspec_model foo

编辑 Foo 迁移:

类 CreateFoos

$ 耙分贝:迁移

编辑规范/模型/foo_spec.rb:

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

描述 Foo do
  之前(:每个)做
    @valid_attributes = {
      :酒吧 => 12345
    }
  结尾

  它“应该在给定有效属性的情况下创建一个新实例”
    foo = Foo.new(@valid_attributes)
    foo.save
    放“睡觉……”
    睡觉(20)
  结尾
结尾

$ 耙子规格

当您看到“sleeping...”时,切换到另一个打开的终端,其中 mysql 会话连接到 test_test 数据库并执行以下操作:

mysql> 从 foos 中选择 *; 空集(0.00 秒)

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

4

3 回答 3

14

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

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

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

self.use_transactional_fixtures = false

代替

self.use_transactional_fixtures = true

它将导致您的测试数据库中的数据持续存在。

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

于 2009-01-13T02:19:44.577 回答
4

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

tail -f log/test.log

当测试运行时,您应该会看到交易飞逝。

于 2009-01-13T02:32:48.793 回答
4

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

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

于 2009-01-13T05:51:23.560 回答