我想对我使用的搜索功能进行一些 Cucumber/webrat 集成测试,thinking_sphinx & sphinx
但问题是在典型的黄瓜测试期间数据已加载然后在事务中回滚,因此 thinking_sphinx 无法对其进行索引。或者,有没有办法只为一部分测试关闭事务?
你解决了这个问题吗?
[编辑 - 请不要建议模拟搜索结果。我希望集成测试来测试所有功能的集成,包括thinking_sphinx]。
我想对我使用的搜索功能进行一些 Cucumber/webrat 集成测试,thinking_sphinx & sphinx
但问题是在典型的黄瓜测试期间数据已加载然后在事务中回滚,因此 thinking_sphinx 无法对其进行索引。或者,有没有办法只为一部分测试关闭事务?
你解决了这个问题吗?
[编辑 - 请不要建议模拟搜索结果。我希望集成测试来测试所有功能的集成,包括thinking_sphinx]。
我看到这个声明中的问题:
在典型的黄瓜测试期间,数据被加载,然后在事务中回滚,因此 thinking_sphinx 无法索引它
让 thinking_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: ...
通过使用数据库清理插件并修改我们的 features/support/env.rb,我们能够让我们的黄瓜测试成功地与 think sphinx 一起工作,如下所示:
# 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
如您所见,我们还创建了一个“黄瓜”环境和一个单独的数据库(为了同时运行黄瓜和规格而不会发生冲突) - 所以您需要在您的 database.yml 和 sphinx 中添加一个“黄瓜:”条目。 yml 如果你也想这样做。
链接的建议不起作用,因为 Rake 任务在单独的过程中调用索引器,因此在测试事务之外。
我不知道有什么办法可以解决这个问题,除了关闭测试事务以便 sphinx 索引进程可以看到新的和更新的记录。为此,在您的 中TestCase
,只需添加该行
self.use_transactional_fixtures = false
请记住,您需要在测试结束时管理清除所有数据。
我不建议您测试不属于您的组件。这将是一个非常脆弱的测试,因为它将取决于特定版本的 sphinx 中的特定排名算法,该算法可能会在以后发生变化,从而在未来返回不可预测的结果。
但是,如果您想这样做,我建议运行单独的索引以通过 mysql 适配器或 xmlpipe2 选项使用测试数据库进行测试(xml2pipe 显然可以让您更改数据集而无需更改 sphinx 文件中的索引选项) . 这可能需要您一次单独设置测试数据,删除索引(使用 ruby shell 命令),然后强制重新索引(等待索引文档的总数与已知的数据库记录数量相同) 并针对数据运行测试。
我真的会警告不要像我说的那样测试索引,您可能会发现自己不得不处理不断中断的测试或缓慢的测试运行时间(取决于您索引的数据量)
这可能比它的价值更麻烦,但是您是否尝试过打开增量索引?
我尝试了建议的解决方案,但 sphinx 超时并出现以下错误。我认为在启用事务装置时无法重新索引 sphinx。
错误:索引'document_core':sql_query_pre [0]:超过锁定等待超时;尝试重启事务
另一个使用标签来分离黄瓜思维狮身人面像测试的例子在这里使用黄瓜标签。