Dado que tengo una Personable
inquietud en mi aplicación Rails 4 que tiene un full_name
método, ¿cómo haría para probar esto usando RSpec?
preocupaciones / personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
ruby-on-rails
testing
rspec
Kyle Decot
fuente
fuente
ActiveSupport::Concern
ha sacado de Rails? Pensé que se había ido hace un rato.Respuestas:
El método que encontró ciertamente funcionará para probar un poco de funcionalidad, pero parece bastante frágil: su clase ficticia (en realidad, solo una
Struct
en su solución) puede o no comportarse como una clase real queinclude
es de su interés. Además, si está tratando de probar las preocupaciones del modelo, no podrá hacer cosas como probar la validez de los objetos o invocar devoluciones de llamada de ActiveRecord a menos que configure la base de datos en consecuencia (porque su clase ficticia no tendrá un respaldo de tabla de base de datos eso). Además, querrá no solo probar la preocupación, sino también probar el comportamiento de la preocupación dentro de las especificaciones de su modelo.Entonces, ¿por qué no matar dos pájaros de un tiro? Al usar los grupos de ejemplo compartidos de RSpec , puede probar sus inquietudes con las clases reales que los usan (por ejemplo, modelos) y podrá probarlos en todos los lugares donde se usan. Y solo tiene que escribir las pruebas una vez y luego incluirlas en cualquier especificación del modelo que utilice su preocupación. En su caso, esto podría verse así:
Las ventajas de este enfoque se vuelven aún más obvias cuando comienza a hacer cosas que le preocupan, como invocar devoluciones de llamada de AR, donde nada menos que un objeto AR simplemente no funcionará.
fuente
parallel_tests
. Creo que será mejor tener pruebas separadas en lugar de usarshared_examples_for
yit_behaves_like
.parallel_tests
se basan en cada archivo, por lo que los ejemplos compartidos no deberían ralentizarlo. También diría que los comportamientos compartidos agrupados de forma adecuada superan la velocidad de prueba.concerns
directorio en suspec_helper.rb
github.com/rspec/rspec-core/issues/407#issuecomment-1409871_spec
al nombre de archivo que contiene shared_examples_for (personable_spec.rb en este caso), de lo contrario, recibirá un mensaje de advertencia engañoso: github.com/rspec/rspec-core/issues/828 .En respuesta a los comentarios que recibí, esto es lo que terminé haciendo (si alguien tiene mejoras, no dude en publicarlas) :
spec / preocupaciones / personable_spec.rb
fuente
Person
. Editaré para arreglar.undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
Otro pensamiento es usar la gema with_model para probar cosas como esta. Estaba buscando probar una preocupación por mí mismo y había visto la gema pg_search haciendo esto . Parece mucho mejor que probar en modelos individuales, ya que pueden cambiar, y es bueno definir las cosas que necesitará en su especificación.
fuente