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

这里的问题是,当我尝试在随后的 subjectlet 块中使用它们时,我在 describeit 块中创建的任何装置都已经消失(从数据库中)。

例如(使用 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 以及其他块而苦苦挣扎,所以也许这就是我的问题,但基本上这失败了,因为当它尝试从数据库中获取用户时,由于after(:each) 钩子(Hook)被调用,大概是在 let 之后?

最佳答案

如果您打算一起使用 subjectlet,您需要了解它们是如何/何时被调用的。在这种情况下, subjectuser 生成的 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/

10-13 05:29