【发布时间】:2015-05-19 18:36:38
【问题描述】:
我在我的测试脚本(直接导入并与模型交互)中的测试之间运行rails db:reset db:migrate,但更改未反映在第一个测试和第二个测试之间。更具体地说,第一次测试引起的变化并没有按原样逆转。
当我从外部(从 shell)连接到数据库时,我观察到命令已经生效。
我已经看过this question,但解决方案没有效果(从字面上看,没有错误,但也没有明显的效果)。
如何强制我的测试脚本清除其内存缓存中的 sqlite 状态?
重现问题的完整步骤。
-
创建一个新的 Rails 应用程序。
rails new MWE -
将以下内容放入
db/schema.rbActiveRecord::Schema.define(version: 20140408213603) do create_table "users", force: true do |t| t.string "username" end end -
将以下内容放入
db/seed.rb。User.create(username: 'user1') User.create(username: 'user2') User.create(username: 'user3') -
将以下内容放入
Gemfile。source 'https://rubygems.org' gem 'rails', '4.0.0' gem 'sqlite3' gem 'protected_attributes' -
将以下内容放入名为
app/models/user.rb的文件中。class User < ActiveRecord::Base attr_accessible :username end -
运行以下命令。
bundle install rake db:reset -
将以下内容放入名为
MWE.rb的文件中load 'config/application.rb' load 'config/environment.rb' load 'app/models/user.rb' # Mimic the unsafe call in the source code system("bundle exec rake db:reset") puts User.count User.destroy_all("username = 'user3'") puts User.count system("bundle exec rake db:reset") puts User.count User.destroy_all("username = 'user3'") puts User.count -
运行文件并观察实际输出。
$ ruby MWE.rb -- create_table("users", {:force=>true}) -> 0.0362s -- initialize_schema_migrations_table() -> 0.0248s 3 2 -- create_table("users", {:force=>true}) -> 0.0809s -- initialize_schema_migrations_table() -> 0.0490s 2 2
所需的输出
-- create_table("users", {:force=>true})
-> 0.0362s
-- initialize_schema_migrations_table()
-> 0.0248s
3
2
-- create_table("users", {:force=>true})
-> 0.0809s
-- initialize_schema_migrations_table()
-> 0.0490s
3
2
如何强制数据库重置反映在模型中?
【问题讨论】:
-
您能否发布一些代码以便我们重现该问题?
-
@BroiSatse,我正在努力。为此创建一个 MWE 并非易事,所以我想我会在完成 MWE 之前发布,以防有人已经看到这个问题。
-
@BroiSatse,已发布完整的 MWE。请注意,我是 ruby / rails 的相对新手,所以如果您知道如何使这个 MWE 变得更小,也请对此发表评论。
标签: ruby-on-rails ruby caching