ruby-on-rails - rails - rspec tutorial
Rieles: denominación de ámbitos denominados: ¿resultados de ámbito de prueba o configuración de ámbito? (1)
¿Cómo se deben probar los Rails denominados ámbitos? ¿Probas los resultados devueltos por un alcance, o que tu consulta está configurada correctamente?
Si tengo una clase de User
con un método .admins
como:
class User < ActiveRecord::Base
def self.admins
where(admin: true)
end
end
Probablemente especifique para asegurarme de obtener los resultados que espero:
describe ''.admins'' do
let(:admin) { create(:user, admin: true) }
let(:non_admin) { create(:user, admin: false) }
let(:admins) { User.admins }
it ''returns admin users'' do
expect(admins).to include(admin)
expect(admins).to_not include(non_admin)
end
end
Sé que esto genera visitas a la base de datos, pero realmente no vi ninguna otra opción si quería probar el comportamiento del alcance.
Sin embargo, recientemente he visto que se especifican ámbitos confirmando que están configurados correctamente , en lugar de en el conjunto de resultados devuelto. Para este ejemplo, algo como:
describe ''.admins'' do
let(:query) { User.admins }
let(:filter) { query.where_values_hash.symbolize_keys }
let(:admin_filter) { { admin: true } }
it ''filters for admin users'' do
expect(filter).to eq(admin_filter) # or some other similar assertion
end
end
Nunca me había ocurrido realmente probar las entrañas directas de una consulta como esta, y por su valor nominal me resulta atractiva ya que no toca la base de datos, por lo que no se incurre en ningún golpe de velocidad.
Sin embargo, me inquieta porque:
- está haciendo una prueba de caja negra gris (er)
- Tengo que suponer que, debido a que algo se configura de cierta manera, obtendré los resultados que mi lógica comercial requiere
El ejemplo que he usado es tan trivial que tal vez estaría bien simplemente probando la configuración, pero:
- ¿dónde dibujas la línea y dices ''el contenido de este alcance nombrado es demasiado complejo y requiere pruebas de confirmación de resultados además de las pruebas de configuración de alcance''? ¿Esa línea existe o debería?
- ¿Hay una forma legítima / bien aceptada / ''mejor práctica'' (lo siento) para probar ámbitos con nombre sin tocar la base de datos, o al menos tocarla mínimamente, o es simplemente inevitable?
- ¿Utiliza alguna de las formas anteriores para probar sus ámbitos o algún otro método por completo?
Esta (s) pregunta (s) es un poco similar a la prueba de ámbitos nombrados con RSpec , pero no pude encontrar respuestas / opiniones sobre la prueba de los resultados del alcance frente a la configuración del alcance.
Creo que has descrito el problema muy bien, y que la mejor respuesta, en mi opinión es - depende.
Si su alcance es trivial, run-of-the-mill where
, con un poco de order
, etc., no hay una necesidad real de probar ActiveRecord
o la base de datos para asegurarse de que funcionen correctamente, puede suponer con seguridad que se han implementado correctamente. y simplemente prueba la estructura que esperas.
Si, por otro lado, su alcance (o cualquier consulta) es compuesto, o utiliza funciones avanzadas en una configuración compleja, creo que la configuración de pruebas que afirman su comportamiento, mediante el uso de una base de datos real (que se instala localmente, con un pequeño conjunto de datos personalizado) puede ser de gran ayuda para garantizarle que su código funciona.
También lo ayudará, si decide cambiar las estrategias (use esa nueva característica de mysql
o la migración a postgresql
), para refactorizar de forma segura, verificando que la funcionalidad sea sólida.
Esta es una forma mucho mejor que simplemente verificar que la cadena SQL
es lo que escribiste allí ...