The problem: you want to test a Django view for results of a search query, but Haystack will be using your real query index, built from your real database, instead of an index built from your test fixtures.
Turns out you can generalise this for any Haystack back-end by replacing the
haystack.backend module with the simple back-end.
from myapp.models import MyModel from django.test import TestCase import haystack class SearchViewTests(TestCase): fixtures = ['test-data.json'] def setUp(self): self._haystack_backend = haystack.backend haystack.backend = haystack.load_backend('simple') def tearDown(self): haystack.backend = self._haystack_backend def test_search(self): results = SearchQuerySet().all() assert results.count() == MyModel.objects.count()
My first attempt at this made changes to the project settings and did
HAYSTACK_WHOOSH_STORAGE = "ram" which works but was complicated because then you have to re-build the index with the fixtures loaded, except the fixtures don’t get loaded in
TestCase.setUpClass, so the choice was to load the fixtures myself or to re-index for each test. And it was specific to the Whoosh back-end of course.
(This is for Django 1.4 and Haystack 1.2.7. In my actual project I get to deploy on Python 2.5. Ain’t I lucky? On a fucking PowerMac G5 running OS X Server 10.5 for fuck sacks.)