gpt4 book ai didi

ruby-on-rails - RSpec + DatabaseCleaner 帮助——拆卸过早发生

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:07 24 4
gpt4 key购买 nike

我对 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

这里的问题是,当我尝试在以下 subjectlet block 中创建的任何 fixtures 已经消失(从数据库中)时 describeit block 。

例如(使用 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

我正在为我应该如何嵌套这些 describesubject 以及其他 block 而苦苦挣扎,所以也许这是我的问题,但基本上这失败了,因为当它试图从数据库中获取用户,由于调用了 after(:each) Hook ,它已被删除,大概是在 let?

之后

最佳答案

如果您要一起使用 subjectlet,您需要了解如何/何时调用它们。在这种情况下,subjectlet 生成的 user 方法之前被调用。问题不在于对象在 subject 被调用之前从数据库中删除,而是它甚至没有在那个时候创建​​。

如果您使用 let! 方法,您的示例将工作,该方法添加一个 before 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com