2012-05-08 14 views
14

Mam klasę modelu, która buforuje dane w trybie redis. Przy pierwszym wywołaniu metody na modelu oblicza wartość JSON/Hash i przechowuje ją w Redis. W pewnych okolicznościach "spłukiwam" te dane i zostanie to przeliczone podczas następnego połączenia.Pisanie testów z RSpec dla Redis z szynami

Oto fragment kodu podobny do tego, którego używam do przechowywania danych w Redis:

def cache_data 
    self.data_values = data_to_cache 
    REDIS.set(redis_key,ActiveSupport::JSON.encode(self.data_values)) 
    REDIS.get(redis_key) 
end 

def data_to_cache 
    // generate a hash of values to return 
end 

jak mam testów jednostkowych ten kod? Używam RSpec i Capybara. Używam również Cucumber i Capabara do testowania integracji, jeśli to pomaga.

Odpowiedz

18

Chciałbym, aby redis działał podczas testów. Redis, w przeciwieństwie do np. Postgres jest niezwykle szybki i nie spowalnia zauważalnego czasu wykonywania testów.

Po prostu upewnij się, że dzwonisz pod numer REDIS.flush w bloku before(:each) lub odpowiadającym mu haczykiem ogórka.

Możesz przetestować data_to_cache niezależnie od numeru redis, ale jeśli nie możesz w pełni ufać używanemu sterownikowi redis i kontraktowi, który oferuje, bezpieczniej jest przetestować na żywo cache_data (i odpowiednią metodę pobierania pamięci podręcznej). Pozwala to również na przełączanie się do innego sterownika redis (lub do innego szybkiego sklepu KV) bez hurtowego przepisywania testów.

+11

Wierzę, że jest to teraz 'REDIS.flushdb' –

17

Przede wszystkim dodaj poniższy kod w spec_helper.rb tak będziesz mieć pewność, że testy będą działać na każdym komputerze, nawet jeśli serwer Redis nie jest zainstalowany:

redis_instance = MockRedis.new 
Redis.stubs(:new).returns(redis_instance) 
Redis::Store.stubs(:new).returns(redis_instance) 

Po tym chciałbym Test:

  1. dane zapisywane Redis jest oczekiwane dane
  2. sekwencja cache_data, flush_data, cache_data nazywa data_to_cache dwukrotnie
+0

Zaleca się, aby program redis działał i faktycznie testował interakcję danych z redis. To nakłada na siebie zależność posiadania redisa podczas uruchamiania testów (o których ogólnie nie jestem przeciwny). Dodaje jednak zależność, którą widzę, może zalecać obsługę za pomocą kodów pośredniczących. –

+0

Nie. To robota MockRedis ... przechowuje dane w pamięci, więc nie potrzebujesz serwera redis. Powiedziałem "abyś był pewien, że testy będą wykonywane na dowolnym komputerze, nawet jeśli serwer Redisa nie jest zainstalowany". – bcd

+10

Jedna rzecz, którą możesz chcieć dodać na początku tej odpowiedzi, co było bardzo pomocne: dodaj 'gem 'mock_redis'' do twojego Gemfile'a i dodaj tę linię do swojego spec_helpera oraz' require' mock_redis'' –

Powiązane problemy