我对 RSpec 一直坚持基于 xUnit 的测试框架有点迷茫,但我试一试。
编写规范的方式的嵌套性质让我对应该在哪里进行数据库设置/拆卸感到头疼。
根据 DatabaseCleaner README:
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
这里的问题是,当我尝试在随后的
subject
或 let
块中使用它们时,我在 describe
或 it
块中创建的任何装置都已经消失(从数据库中)。例如(使用 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)
钩子(Hook)被调用,大概是在 let
之后? 最佳答案
如果您打算一起使用 subject
和 let
,您需要了解它们是如何/何时被调用的。在这种情况下, subject
在 user
生成的 let
方法之前调用。问题不在于在调用 subject
之前从数据库中删除了对象,而是在那时甚至没有创建它。
如果您使用 let!
方法,您的示例将起作用,该方法添加了一个 before
Hook ,该 Hook 在示例之前(因此在调用 user
之前)隐式调用 subject
方法。
也就是说,我建议您停止挣扎并使用 RSpec 已经公开的更简单的 API:
describe User do
it "finds a user with login credentials" do
user = User.make(:username => "test", :password => "password")
User.get_by_login_credentials!("test", "password").should eq(user)
end
end
这对我来说似乎要简单得多。
关于ruby-on-rails - RSpec + DatabaseCleaner 帮助——拆卸过早发生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6111909/