I use the sunspot-rails for search. These is a Rspec looks like:
describe "GET search" do
before(:all) do
system("rake", "sunspot:solr:start")
end
after(:all) do
system("rake", "sunspot:solr:stop")
end
it "should do some search" do
Text.search do
...
end
end
end
But it doesn't work. I got a failure:
Errno::ECONNREFUSED:
Connection refused - connect(2)
But if I type rake sunspot:solr:start RAILS_ENV=test
by hand in command line, and then run the spec, it passes.
What's wrong? Isn't rake sunspot:solr:start RAILS_ENV=test
equivalent to system("rake", "sunspot:solr:start")
in test mode?
(I tried `system("rake", "sunspot:solr:start RAILS_EVN=test"). Same.)
I got this working just by adding
to spec_helper.rb
Edit: I ended up going with https://github.com/collectiveidea/sunspot_test like Simmo mentioned. It was re-running the rake task on every test run for some reason (even though I had it in the prefork block of spork). Not sure why, but the sunspot_test gem seems like the way to go for now.
Your
before(:all)
probably just isn't giving Solr enough time to start.That said, you'll probably want to think hard about just what you're asking your specs to verify here. You can go a long way with mocking out calls to Solr with a library like Fakeweb.
Pivotal Labs also has a library called sunspot_matchers that can capture more fine-grained assertions about the searches you're invoking.
If you are going for real integration specs against Solr, I advise just keeping a test Solr running while you work. A tool like Foreman can help manage your Solr proceses. I might use a
Procfile
like the following:(Development is, of course, the default environment if no RAILS_ENV is otherwise provided to
foreman start
)Finally, if you want to start Solr within your specs, you're already on the right track. Just toss a
sleep
in there with enough time to let Solr fully boot itself before your specs start running. Don't be surprised if that introduces a bit of unpredictable failure into your spec suite when the system is under load.[Edit: Quick and dirty
before :all
which usesSunspot.remove_all
to poll for availability.]The sunspot_test gem will do this for you and supports RSpec.
This is a wild-ass guess, but I bet you have a Solr server configured in your config/environments/development.rb file to look locally on a given port, but no such configuration in your config/environments/test.rb
This is causing it to connect to the default address/port where you do not in fact have a Solr server running when you execute your tests.
I don't know enough about the Solr client in Ruby to be sure of this, but since no one else has weighed in yet I hope this points you in the right direction.