0

我正在尝试重构一些 RSpec/Rails 测试,以便它们将尽可能少的对象保留到数据库中,但是在试图弄清楚如何重写测试时遇到了麻烦,如下所示:

describe User do
  context "record creation" do
    before(:each) { @user = User.new(user_atts) }

    it "should generate a confirmation_token" do
      # Generated as the result of a callback
      @user.save!
      expect(@user.confirmation_token).to be_present
    end

    it "should set the confirmed_at attribute to nil" do
      # Cleared as the result of a callback
      @user.save!
      expect(@user.confirmed_at).to be_nil
    end

    it "should call the send_confirmation_instructions method" do
      @user.should_receive(:send_confirmation_instructions) {}
      @user.save!
    end
  end

  def user_atts
    # return attributes hash
  end
end

这是一个非常简单的示例,但在我的规范中有很多类似的实例,并且在大多数情况下,它们都将记录保存到数据库中。我很想利用 RSpecletsubject助手,但我不完全确定这些甚至会在这里有所帮助。

我一直在使用FactoryGirl,并认为它的build_stubbed策略可能会加快我的规范,但我找不到很多可以帮助限制实际记录创建的实例(或者我可能不知道如何使用)。

我假设在某些情况下测试需要创建记录,但上面的示例几乎不像其中之一。我什至应该尝试重构它还是编写这些测试更好?任何帮助将不胜感激。

4

1 回答 1

2

我的测试可能看起来像这样。

describe User do
  let(:user) { FactoryGirl.build_stubbed(:user) } 

  context "record creation" do
    it "should generate a confirmation_token" do
      user.save!
      expect(user.confirmation_token).to be_present
    end

    it "should set the confirmed_at attribute to nil" do
      user.save!
      expect(user.confirmed_at).to be_nil
    end

    it "should call the send_confirmation_instructions method" do
      expect(user).to receive(:send_confirmation_instructions).once
      user.save!
    end
  end
end

那是使用 Factory Girl 创建用户模型。此外,如@RahulGarg 所述,我会让 DatabaseCleaner 在每次测试后清除数据库

你所要做的就是在你的 spec_helper 中配置类似这样的东西

  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

这意味着在每次测试后数据库将被清除。

于 2013-01-21T19:11:11.423 回答