Étant donné que j'ai un Personable
problème dans mon application Rails 4 qui a une full_name
méthode, comment procéder pour tester cela à l'aide de RSpec?
préoccupations / personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
ruby-on-rails
testing
rspec
Kyle Decot
la source
la source
ActiveSupport::Concern
été retiré de Rails? Je pensais que ça s'était passé il y a un moment.Réponses:
La méthode que vous avez trouvée fonctionnera certainement pour tester un peu de fonctionnalité mais semble assez fragile - votre classe fictive (en fait, juste un
Struct
dans votre solution) peut ou non se comporter comme une vraie classe quiinclude
vous concerne. De plus, si vous essayez de tester les problèmes de modèle, vous ne pourrez pas faire des choses comme tester la validité des objets ou appeler des rappels ActiveRecord à moins que vous ne configuriez la base de données en conséquence (car votre classe factice n'aura pas de support de table de base de données il). De plus, vous voudrez non seulement tester le problème, mais également tester le comportement du problème dans les spécifications de votre modèle.Alors pourquoi ne pas faire d'une pierre deux coups? En utilisant les groupes d'exemples partagés de RSpec , vous pouvez tester vos préoccupations par rapport aux classes réelles qui les utilisent (par exemple, les modèles) et vous pourrez les tester partout où elles sont utilisées. Et vous ne devez écrire les tests qu'une seule fois, puis les inclure dans n'importe quelle spécification de modèle qui utilise votre préoccupation. Dans votre cas, cela pourrait ressembler à ceci:
Les avantages de cette approche deviennent encore plus évidents lorsque vous commencez à faire des choses dans votre préoccupation, comme invoquer des rappels AR, où rien de moins qu'un objet AR ne fera tout simplement pas l'affaire.
la source
parallel_tests
. Je pense qu'il vaudra mieux avoir des tests séparés au lieu d'utilisershared_examples_for
etit_behaves_like
.parallel_tests
sont basés par fichier, donc les exemples partagés ne devraient pas le ralentir. Je dirais également que les comportements partagés correctement groupés l'emportent sur la vitesse des tests.concerns
répertoire dans votrespec_helper.rb
github.com/rspec/rspec-core/issues/407#issuecomment-1409871_spec
N'ajoutez pas au nom de fichier qui contient shared_examples_for (personable_spec.rb dans ce cas), sinon vous obtiendrez un message d'avertissement trompeur - github.com/rspec/rspec-core/issues/828 .En réponse aux commentaires que j'ai reçus, voici ce que j'ai fini par faire (si quelqu'un a des améliorations, n'hésitez pas à les publier) :
spec / concern / personable_spec.rb
la source
Person
. Je vais modifier pour corriger.undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
Une autre idée est d'utiliser la gemme with_model pour tester des choses comme celle-ci. Je cherchais moi-même à tester un problème et j'avais vu le gem pg_search faire cela . Cela semble beaucoup mieux que de tester des modèles individuels, car ceux-ci peuvent changer, et il est bon de définir les éléments dont vous aurez besoin dans vos spécifications.
la source