rails 4 rspec太阳黑子solr测试间歇性失败

时间:2014-06-16 21:42:35

标签: ruby-on-rails ruby solr rspec

让我们为这个问题奠定基础。

这是我们的模型:

class Deal < ActiveRecord::Base
  belongs_to :retailer
  has_many :content_locations, as: :locatable
  has_many :stores, through: :content_locations

  searchable do
    text :title
    text :store_name
    text :store_sort_name
    text :description
  end

  scope :by_keyword, ->(keyword, limit, offset) {
    search {
      fulltext keyword
      paginate offset: offset, per_page: limit
    }.results
  }
end

以下是我们的rspec测试中击中SOLR的部分:

  describe 'searchable' do
    before do
      DatabaseCleaner.clean
    end
    target = 'foo'

    let!(:deal_with_title) { create :deal, title: target }
    let!(:deal_with_description) { create :deal, description: target }
    let!(:deal_with_store_name) { create :deal, store_name: target }
    let!(:deal_with_store_sort_name) { create :deal, store_sort_name: target }
    let!(:deal_with_nothing) {
      create :deal, title: 'bar', description: 'bar', store_name: 'bar', store_sort_name: 'bar'
    }

    it 'includes matches' do
      sleep 1
      results = Deal.by_keyword(target, 25, 0)

      expect(results).to include(deal_with_title)
      expect(results).to include(deal_with_description)
      expect(results).to include(deal_with_store_name)
      expect(results).to include(deal_with_store_sort_name)

      expect(results).to_not include(deal_with_nothing)
    end
  end

我们看到的是我们的测试随机失败。我可以一次又一次地成功执行这个测试1-3xs但是第4次会失败,否则它将失败4xs而第5次失败。该模式完全是随机的。如您所见,我们尝试在此设置中添加睡眠,除了减慢速度之外没有任何作用。

这里有任何提示。这让我们疯了!

2 个答案:

答案 0 :(得分:1)

Sunspot Model Spec他们总是打电话

 Sunspot.commit
数据创建后和任何检查之前

更新:

您也可以调用model.index!,它会立即将特定模型同步到solr索引中。在一个特定的情况下,我还必须在保存之后和索引之前调用model.reload,因为附加到模型的一些标记关系(但这是acts_as_taggable特定的)

  #simple
  Factory.create(:model).tap { |m| m.index! }


  #advanced
  model = Factory.build :model_with_relationships
  model.save
  model.reload #optional
  model.index!

答案 1 :(得分:1)

我们决定走一个完全不同的方向,老实说,我不建议任何人阅读这篇文章时实时击中SOLR。这是一种痛苦。

我们的最终解决方案是改为使用sunspot_matchers gem。