繁体   English   中英

Rails:将cumming_sphinx与Cucumber和Webrat进行集成测试-如何索引事务性固定装置?

[英]Rails: Integration testing thinking_sphinx with cucumber and webrat - how do I index transactional fixtures?

我想对使用thinking_sphinx & sphinx Sphinx的搜索功能进行一些Cucumber / Webrat集成测试,但是问题是在典型的黄瓜测试过程中,先加载数据,然后在事务中回滚,所以无法使用thinking_sphinx进行测试。索引它。 或者,是否有一种方法可以仅对部分测试关闭事务?

你解决了这个问题吗?

[编辑-请不要建议模拟搜索结果。 我希望集成测试可以测试所有功能(包括think_sphinx)的集成。

通过使用数据库清洁程序插件并按如下所示修改我们的功能/support/env.rb,我们能够使黄瓜测试成功地与思维狮身人面像配合使用:

# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] ||= "cucumber"

...

# http://github.com/bmabey/database_cleaner
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
Before do
  DatabaseCleaner.clean
end

ThinkingSphinx::Configuration.instance.build
ThinkingSphinx::Configuration.instance.controller.start
at_exit do
  ThinkingSphinx::Configuration.instance.controller.stop
end
ThinkingSphinx.deltas_enabled = true
ThinkingSphinx.updates_enabled = true
ThinkingSphinx.suppress_delta_output = true

# Re-generate the index before each Scenario
Before do
  ThinkingSphinx::Configuration.instance.controller.index
end

如您所见,我们还创建了一个“黄瓜”环境和一个单独的数据库(以便同时运行黄瓜和规格,而不会发生冲突)-因此您将需要在数据库.yml和狮身人面像中添加一个“黄瓜:”条目。 yml,如果您也想这样做。

我看到问题出在以下语句中:

在典型的黄瓜测试期间,数据已加载并在事务中回滚,因此没有办法使think_sphinx对其进行索引

让think_sphinx索引结果可能不是很快 ,但是在事务中肯定是可能的。 由于这是一次集成测试,并且没有对您的每个(许多)单元测试都进行过测试,所以我考虑了速度。

因此,现在您需要弄清楚如何在事务处理期间触发该重新索引。

# somewhere in /features/support:
before('@reindexing') do
  require 'Rake'

  class MyModel
    after_save :force_reindex!

    def force_reindex!
      # in case multiple runs of this block cause the hook
      # to get added multiple times, let's check to make sure
      # we haven't already reindexed for this save
      return if @__reindexed
      Rake["thinking_sphinx:rebuild"].execute
      @__reindexed = true
    end
  end
end

after('@reindexing') do
  class MyModel
    def force_reindex!
      # do nothing; the hook still gets called, but that's ok
    end
  end
end

/features/integration.feature (或其他任何内容)中,

@reindexing
Feature: The whole shebang, altogether

  Scenario: ...

链接的建议不起作用,因为Rake任务在单独的过程中调用索引器,因此在测试事务之外也是如此。

除了关闭测试事务以使狮身人面像索引过程可以查看新记录和更新记录外,我不知道有什么方法可以解决此问题。 为此,在您的TestCase ,只需添加以下行

self.use_transactional_fixtures = false

请记住,您需要在测试结束时管理清除所有数据。

另一个使用标签来分隔黄瓜思维狮身人面像测试的示例, 此处使用了黄瓜标签。

我不建议您测试不属于您的组件。 这将是一个相当脆弱的测试,因为它将取决于特定版本的狮身人面像中的特定排名算法,该算法稍后可能会更改,因此将来会返回不可预测的结果。

如果要执行此操作,我建议您通过mysql适配器或xmlpipe2选项使用测试数据库运行单独的索引进行测试(显然,xml2pipe允许您更改数据集,而无需更改sphinx文件中的索引选项) 。 这可能需要您一次单独设置测试数据,删除索引(使用ruby shell命令),然后强制重新索引(等待索引文档的总数与已知数据库记录的数量相同) ),然后对数据进行测试。

我真的要避免对索引进行测试,就像我说过的那样,您可能会发现自己不得不面对不断中断的测试或缓慢的测试运行时间(取决于要建立索引的数据量)

这可能比它的价值更麻烦,但是您是否尝试过打开增量索引?

我尝试了建议的解决方案,但狮身人面像超时并出现以下错误。 我认为启用交易固定装置后无法重新索引狮身人面像。

错误:索引'document_core':sql_query_pre [0]:超出了锁定等待超时; 尝试重新启动事务

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM