DMi*_*ler 10 ruby rspec ruby-on-rails
每当我运行用户测试时,RSpec在测试完成后将Fabricated用户留在测试数据库中,这会弄乱我的其他测试.我会做一个rake db:test:prepare
,但是当我再次运行我的测试时,记录会在我的数据库中重新创建.我不知道为什么会这样.它只发生在用户对象上.
在我的spec_helper文件中,我甚至有:
config.use_transactional_fixtures = true
Run Code Online (Sandbox Code Playgroud)
以下是创建记录的示例测试:
it "creates a password reset token for the user" do
alice = Fabricate(:user)
post :create, email: alice.email
expect(assigns(alice.password_reset_token)).to_not eq(nil)
end
Run Code Online (Sandbox Code Playgroud)
制造商:
Fabricator(:user) do
email { Faker::Internet.email }
password 'password'
name { Faker::Name.name }
end
Run Code Online (Sandbox Code Playgroud)
这可能与我的用户模型有关吗?
小智 20
你应该使用一个名为database_cleaner的gem来截断你的数据库并自动重置所有内容,所以在你的gem文件中添加gem database_cleaner之后你的spec_helper.rb配置它
spec_helper.rb
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)
然后在spec/support目录中创建一个新文件
规格/支持/ shared_db_connection.rb
class ActiveRecord::Base
mattr_accessor :shared_connection
@@shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
ActiveRecord::Base.shared_connection=ActiveRecord::Base.connection
Run Code Online (Sandbox Code Playgroud)
现在,无论何时运行测试,数据库都将被重置.这来自Aaron Sumner的"用RSpec进行的日常Rails测试"一书
每个测试都包含在数据库事务中.这意味着测试期间创建的所有内容都应该在测试结束时消失.因此,我怀疑数据库中的任何内容都是在测试之外进行的(就像在一个before(:all)
块中一样).
此外,这并不能保证每次运行测试时数据库都是空的.有可能你不小心意外添加了一条记录,现在它只是不断恢复到那个状态.
如果你想确保你的测试每次都有一个闪亮的数据库,你应该看看database_cleaner gem.
如果我不得不猜测,该行post :create, email: alice.email
似乎可能是执行实际用户创建的候选行。
使用虚假测试对该行进行存根,看看是否仍在数据库中创建用户。
归档时间: |
|
查看次数: |
10989 次 |
最近记录: |