2012-05-08 7 views
14

Tengo una clase de modelo que almacena en caché los datos en redis. La primera vez que llamo a un método en el modelo, calcula un valor JSON/Hash y lo almacena en Redis. Bajo ciertas circunstancias, "elimino" esos datos y se vuelven a calcular en la próxima llamada.Escritura de pruebas con RSpec para Redis con rieles

He aquí el fragmento de código similar a la que yo uso para almacenar los datos en 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 

¿Cómo debo hacer la prueba unidad de este código? Yo uso RSpec y Capybara. También uso Cucumber y Capabara para pruebas de integración si eso ayuda.

Respuesta

18

Me gusta tener redis ejecutándose mientras se ejecutan las pruebas. Redis, a diferencia de, por ejemplo, postgres, es extremadamente rápido y no ralentiza notablemente el tiempo de ejecución de la prueba.

Simplemente asegúrese de llamar al REDIS.flush en un bloque before(:each), o el gancho correspondiente del pepino.

Puede probar data_to_cache independientemente de redis, pero a menos que pueda confiar completamente en el controlador redis que está utilizando y en el contrato que proporciona, es más seguro probar cache_data (y el método de búsqueda de caché correspondiente) en vivo. Eso también le permite cambiar a un controlador de redis diferente (oa una tienda KV rápida diferente) sin una reescritura mayorista de sus pruebas.

+11

Creo que esto ahora es 'REDIS.flushdb' –

17

En primer lugar añadir el código de abajo en el spec_helper.rb por lo que estará seguro de que las pruebas se pueden ejecutar en cualquier máquina, incluso si el servidor Redis no está instalado:

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

Después de que lo haría prueba:

  1. los datos escritos en SRID es los datos esperados
  2. Una secuencia de cache_data, flush_data, cache_data llama al data_to_cache dos veces
+0

Así que recomendaría tener redis en ejecución y realmente probar la interacción de los datos con redis. Esto pone una dependencia de tener redis en ejecución mientras se ejecutan las pruebas (que no estoy en contra en general). Pero agrega una dependencia que puedo ver que algunos podrían recomendar manejar con stubs. –

+0

No. Eso es lo que hace MockRedis ... almacena los datos en la memoria para que no necesites un servidor redis. Dije "para que esté seguro de que las pruebas se ejecutarán en cualquier máquina incluso si el servidor redis no está instalado". – bcd

+10

Una cosa que quizás quieras agregar a la parte superior de esta respuesta, que fue muy útil es: agrega 'gem 'mock_redis'' a tu Gemfile y agrega esta línea a tu spec_helper también' require' mock_redis'' –

Cuestiones relacionadas