【发布时间】:2011-05-24 14:21:38
【问题描述】:
我对 RSpec 一直坚持基于 xUnit 的测试框架有点迷茫,但我正在尝试一下。
规范编写方式的嵌套性质让我对我应该在哪里进行数据库设置/拆卸感到有些头疼。
根据DatabaseCleaner自述文件:
Spec::Runner.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
现在我不能使用事务,因为我在我的代码中使用它们,所以我只是坚持截断,但这不应该在这里也不应该在那里。
我有这个:
RSpec.configure do |config|
config.mock_with :rspec
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
这里的问题是,当我尝试在下面的 describe 或 it 块中使用它们时,我在 subject 或 let 块中创建的任何固定装置都已经消失(从数据库中)。
例如(使用 Machinist 创建夹具......但这不应该是相关的):
describe User do
describe "finding with login credentials" do
let(:user) { User.make(:username => "test", :password => "password") }
subject { User.get_by_login_credentials!("test", "password") }
it { should == user }
end
end
我正在为如何嵌套这些 describe 和 subject 和其他块而苦苦挣扎,所以也许这是我的问题,但基本上这失败了,因为当它试图从数据库中获取用户时,由于调用了after(:each) 钩子,它已经被删除了,大概是在let 之后?
【问题讨论】:
-
顺便说一句,您应该仍然可以使用事务来清理数据库。在大多数数据库中,事务可以嵌套(MySQL 是这里值得注意的例外——这只是另一种糟糕的方式)。
标签: ruby-on-rails ruby rspec datamapper