2011-05-11 7 views
7

Tenemos una aplicación Rails que probamos con RSpec. Queremos especificar las operaciones que dependen de Memcached. ¿Cuál es la mejor práctica para hacerlo?¿Cómo se especifican las operaciones que se basan en Memcached?

Pensé en hacer esto anulando todas las llamadas al Rails.cache. ¿Es esta una buena idea?

Según @Pan Thomakos sugerencia, estoy añadiendo algunos detalles adicionales sobre uno de los escenarios que estoy tratando de prueba:

Tenemos el concepto de cuentas en nuestro sistema, por lo tanto, en cada petición recuperamos el usuario actual y la cuenta actual. Debido a que no hay muchas cuentas en el sistema, las guardamos todas en caché y las recuperamos desde allí.

def self.find_by_slug(slug) 
    Rails.cache.fetch(Account.cache_key_for_slug(slug), :expires_in => 1.day) { super } 
end 

Por esta razón, el almacenamiento en caché en este caso no es sólo un bonito tener un comportamiento, pero el comportamiento esperado y el que quiero probar. Por lo tanto, desactivar el almacenamiento en caché no funcionará.

+0

Puede ser útil si proporciona más información sobre la dependencia que tiene en Memcached o algunas de las operaciones que está intentando probar. Siempre puede desactivar el almacenamiento en caché por completo para que sus pruebas ignoren por completo Rails.cache. ¿Es esto lo que estás buscando? –

+0

Gracias. Revisé mi pregunta – arikfr

Respuesta

2

Prueba sin tropezar en mi humilde opinión!

La secuencia se vería así:

  1. Cache.flush # o equivalente
  2. cache.get (babosa) .shouldbe nula caché # prueba está vacía
  3. Method.find_by_slug (babosa). debería == 'algún valor' # probar que las palabras del método
  4. Cache.get (slug) .should == 'some value' # prueba que el caché tiene valor.

Personalmente, creo que si tiene los recursos a mano, entonces NO DEBERÁ utilizar el enganche. Si no tiene los recursos a la mano (es decir, un servicio de terceros), entonces DEBE utilizarse el resumen.

El problema con el troceo, es que si cambió el código que está cortando, entonces no sabrá si se rompe.

Un ejemplo en este caso sería si cambió de la gema Memcache estándar a Dahli ?, o alguna otra gema Memcache que entregó errores de caché devolviendo valores falsos, nulos o de otro tipo de manera diferente. ¡En serio! Cache.set ("mi_clave", falso)! :)

Un ejemplo para cambiar, sería dejar el protocolo ASCII y pasar al protocolo binario más rápido.

Memcache es un recurso barato, puede configurarlo con 1 meg de RAM para realizar esta prueba. Incluso llegaría a decir que puedes hacer lo mismo con mysql. Algo más grande que mysql, entonces comenzaría a inclinarme hacia el stubbing a medida que el costo para "configurar" esos recursos se vuelva significativo. YMMV.

-Daniel

+0

Gracias! Empezamos sin apagar, pero luego teníamos que asegurarnos de que Memcached se ejecutara antes de hacer la prueba. Es menos un problema de recursos, pero más un problema de conveniencia. Queremos poder ejecutar las pruebas con la menor configuración posible. (dividiendo en 3 comentarios para que sea más legible) – arikfr

+1

Además, aunque estoy de acuerdo en que el troceo tiene sus desventajas, tiene una mayor velocidad al alza. Mientras que en este caso es irrelevante, porque Memcached es rápido en otros casos, importa mucho. – arikfr

+0

Supongo que tenemos que decidir si preferimos pruebas más confiables o más convenientes:/Tal vez hagamos dos conjuntos de pruebas: una con Memcached que se usará en un servidor de CI y otra sin usar en los desarrolladores máquinas. – arikfr

0

Parece como si usted está utilizando Rails.cache.fetch directamente su mejor opción es a trozo. Pero si usa los helpers del controlador (que ahora están en gemas separadas en rieles 4), encontré esta gema que es útil https://github.com/avit/rspec-rails-caching

Cuestiones relacionadas