Ruby on rails 数据库_cleaner未清除我的一些测试(rspec、水豚、硒)

Ruby on rails 数据库_cleaner未清除我的一些测试(rspec、水豚、硒),ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,数据库清理器在大多数情况下都能工作,但在某些情况下,我希望在每次测试后都能清除像user\u id这样的内容,但它不能。因此,用户id将在整个过程中递增,而不是清除,并且用户id可预测为1、2、3或为测试创建的任何数量。我可以直接调用id,而不是硬编码预期的结果,但稍后我真的需要它来在更复杂的示例中清除这些内容。这是最容易展示的。任何帮助都将不胜感激 从SPEC_HELPER.RB: RSpec.configure do |config| config.mock_with :rspec

数据库清理器在大多数情况下都能工作,但在某些情况下,我希望在每次测试后都能清除像user\u id这样的内容,但它不能。因此,用户id将在整个过程中递增,而不是清除,并且用户id可预测为1、2、3或为测试创建的任何数量。我可以直接调用id,而不是硬编码预期的结果,但稍后我真的需要它来在更复杂的示例中清除这些内容。这是最容易展示的。任何帮助都将不胜感激

从SPEC_HELPER.RB:

RSpec.configure do |config|

  config.mock_with :rspec
  config.include FactoryGirl::Syntax::Methods

  config.include(Capybara, :type => :integration)
  config.include Devise::TestHelpers, :type => :controller
  config.use_transactional_fixtures = false

  config.before(:each) do
    I18n.default_locale = :en
    I18n.locale = :en
    DatabaseCleaner.start
    ResqueSpec.reset!
    ActionMailer::Base.deliveries.clear
  end 

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.after(:all) do
    TestCleaner.clean
  end

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
    DatabaseCleaner.strategy = :transaction
    Role.reset_cache!
  end

  config.after(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end
根据我的测试:

      it "should return one provider" do
        get :index

        response.body.gsub(/\s+/, "").should == {
            :experts => [{
                             :availability => false,
                             :name => "#{@provider.user.first_name}#{@provider.user.last_name}",
                             :expert_id => 1,
                             :photo => @provider.details.photo.url
                         }] }.to_json
      end

      it "should show return two providers"  do
        @provider2 = create(:provider)
        get :index

        response.body.gsub(/\s+/, "").should == {
            :experts => [{
                             :availability => false,
                             :name => "#{@provider.user.first_name}#{@provider.user.last_name}",
                             :expert_id => 1,
                             :photo => @provider.details.photo.url
                         },
                         {
                             :availability => false,
                             :name => "#{@provider.user.first_name}#{@provider.user.last_name}",
                             :expert_id => 2,
                             :photo => @provider.details.photo.url
                         }
            ] }.to_json
      end

数据库未正确清理的是请求/集成规范吗?如果是这样,可能是因为您正在使用事务策略而不是截断策略进行清理

尝试添加此选项,这会将策略更改为仅用于集成规范的截断:

config.before type: :integration do
  DatabaseCleaner.strategy = :truncation
end
您不能对集成规范使用事务策略,因为Capybara在具有不同数据库连接的单独线程中运行


这篇文章在为rspec/capybara设置数据库方面帮了我很大的忙。

我在开始测试时经常遇到这个问题。我最终发现这不是因为数据库清理器问题(我也怀疑),而是因为进行测试的代码结构

我能尝试和描述的最好方法是说,基本上,如果你在(:each)设置块之前做了
之外的事情,那么实际的
it
应该会在实际测试之外,并导致这些问题

具体而言,我怀疑这里可能存在一个问题:

  it "should show return two providers"  do
    @provider2 = create(:provider)
    get :index

    response.body.gsub(/\s+/, "").should == {
我希望将此更改为更类似于:

  it "should show return two providers"  do
    before(:each) do { 
      @provider2 = create(:provider)
      get :index
    }

    response.body.gsub(/\s+/, "").should == {

Database cleaner将在事务中包装每个规范,并在规范末尾回滚该事务以删除任何数据库更改。不过,回滚事务不会重置用于自动分配主键的自动增量或序列值


我强烈建议不要硬编码ID。您提到您的示例将变得更加复杂,在这种情况下,在代码中散布随机整数将比在更简单的示例中更难维护。假设您使用的是mysql,那么使用截断策略将重置自动增量值,但速度也慢得多

这与selenium代码有什么关系?因为我看到了很多数据库内容,但在我的selenium测试中也没有发生seleniumit,所以请添加标签,以防我以某种方式创建了冲突或不了解我所有测试部分的总数。即使有可能发生冲突,这仍然不是讨论这个问题的论坛。本论坛面向selenium用户,如果您有特定于selenium的问题,欢迎您提问,但如果没有,我不明白您为什么要浪费时间问一个关于我们权限之外的技术的问题,我也不明白您为什么对一个标签如此激动。选择你的战斗,伙计。我没有做错什么。同意@Abe Kinney,我不知道这是怎么回事。所以标签不是论坛,它们只是元数据。