2012-05-08 20 views
14

Ho una classe modello che memorizza nella cache i dati in rosso. La prima volta che chiamo un metodo sul modello, esso calcola un valore JSON/Hash e lo memorizza in Redis. In determinate circostanze, scarico i dati e vengono ricalcolati alla prossima chiamata.Test di scrittura con RSpec per Redis con Rails

Ecco il frammento di codice simile a quella che uso per memorizzare i dati in 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 

Come dovrei unità di prova di questo codice? Io uso RSpec e Capybara. Uso anche Cucumber e Capabara per i test di integrazione, se ciò aiuta.

risposta

18

Mi piace avere redis in esecuzione mentre i test sono in esecuzione. Redis, a differenza ad es. postgres, è estremamente veloce e non rallenta sensibilmente il tempo di esecuzione del test.

Assicurati di chiamare REDIS.flush in un blocco before(:each) o il corrispondente gancio cetriolo.

È possibile verificare in modo indipendente data_to_cache di Redis, ma a meno che non ci si può fidare completamente il driver Redis che si sta utilizzando e il contratto che fornisce, è più sicuro di testare realmente cache_data (e la corrispondente della cache metodo fetch) vivere. Ciò consente anche di passare a un driver redis diverso (o ad un altro archivio KV veloce) senza una riscrittura completa dei test.

+11

Credo che questo sia ora 'REDIS.flushdb' –

17

Prima di tutto aggiungere il codice qui sotto nella spec_helper.rb modo sarete sicuri che i test verrà eseguito su qualsiasi macchina, anche se non è installato il server Redis:

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

Dopo che l'avrei fatto Test:

  1. i dati scritti REDIS è i dati previsti
  2. Una sequenza di cache_data, flush_data, cache_data chiama il data_to_cache due volte
+0

Quindi si consiglia di eseguire redis e testare effettivamente l'interazione dei dati con redis. Ciò pone una dipendenza dall'avere redis in esecuzione mentre vengono eseguiti i test (che non sono contro in generale). Ma aggiunge una dipendenza che posso vedere alcuni potrebbero raccomandare la gestione con stub. –

+0

No. Quello che sta facendo MockRedis ... memorizza i dati in memoria in modo da non aver bisogno di un server redis. Ho detto "così sarai sicuro che i test verranno eseguiti su qualsiasi macchina anche se il server redis non è installato". – bcd

+10

Una cosa che potresti voler aggiungere all'inizio di questa risposta è stata molto utile: aggiungi 'gem 'mock_redis'' al tuo Gemfile e aggiungi questa linea al tuo spec_helper pure' richiedi 'mock_redis'' –