如何使用RSpec测试ThinkingSphinx

时间:2010-11-11 10:59:37

标签: ruby-on-rails thinking-sphinx

我在一个调用thinking_sphinx的search()方法的模型中有一个类方法。我需要检查这个类方法。

我想在我的rspec测试用例中启动,索引或停止sphinx。我正在尝试使用这段代码。

before(:all) do
  ThinkingSphinx::Test.start
end

after(:all) do
  ThinkingSphinx::Test.stop
end

并在我触发搜索查询之前在每个测试用例中使用此代码

ThinkingSphinx::Test.index

但是在我触发搜索查询之后,它仍然给出了空结果,尽管测试数据库中存在完全匹配。

如果您将rspec与thinking_sphinx一起使用

,请引导我使用代码示例

2 个答案:

答案 0 :(得分:12)

在David发布后,我们最终得到以下解决方案:

#spec/support/sphinx_environment.rb
require 'thinking_sphinx/test'

def sphinx_environment(*tables, &block)
  obj = self
  begin
    before(:all) do
      obj.use_transactional_fixtures = false
      DatabaseCleaner.strategy = :truncation, {:only => tables}
      ThinkingSphinx::Test.create_indexes_folder
      ThinkingSphinx::Test.start
    end

    before(:each) do
      DatabaseCleaner.start
    end

    after(:each) do
      DatabaseCleaner.clean
    end

    yield
  ensure
    after(:all) do
      ThinkingSphinx::Test.stop
      DatabaseCleaner.strategy = :transaction
      obj.use_transactional_fixtures = true
    end
  end
end

#Test
require 'spec_helper'
require 'support/sphinx_environment'

describe "Super Mega Test" do
  sphinx_environment :users do
    it "Should dance" do
      ThinkingSphinx::Test.index
      User.last.should be_happy
    end
  end
end

它将指定的表切换为:截断策略,然后将它们切换回:trasaction strategy。

答案 1 :(得分:4)

这是由于交易灯具

虽然ActiveRecord可以在单个事务中运行其所有操作,但Sphinx无权访问,因此索引不包括您的事务更改。

您必须停用您的交易设备。

在你的rspec_helper.rb中

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end

全局禁用。

请参阅Turn off transactional fixtures for one spec with RSpec 2