Rails & RSpec - Test Concerne les méthodes de la classe
J'ai le texte suivant (simplifié) des Rails de Préoccupation:
module HasTerms
extend ActiveSupport::Concern
module ClassMethods
def optional_agreement
# Attributes
#----------------------------------------------------------------------------
attr_accessible :agrees_to_terms
end
def required_agreement
# Attributes
#----------------------------------------------------------------------------
attr_accessible :agrees_to_terms
# Validations
#----------------------------------------------------------------------------
validates :agrees_to_terms, :acceptance => true, :allow_nil => :false, :on => :create
end
end
end
Je ne peux pas trouver un bon moyen de tester ce module dans RSpec cependant - si je viens de créer un mannequin de classe, je reçois de l'enregistrement actif des erreurs lorsque j'essaye de vérifier que les validations sont de travail. Quelqu'un d'autre a été confronté à ce problème?
Vous devez vous connecter pour publier un commentaire.
Découvrez RSpec partagé des exemples.
De cette façon, vous pouvez écrire le code suivant:
allows_upload :csv
, qui ajoute des méthodes commecsv_file_path
etcsv_file_size
. Mais vous avez un autre modèle qui appelle le fichier téléchargé:attachment
. Maintenant, votre "agit comme télécharger" spec est voué à l'échec parce que l'un est d'ajoutercsv_file_path
et on aattachment_file_path
. Pour cette raison, je me sens comme dans beaucoup de cas, il va répondre à vos besoins préférable d'utiliser un mannequin de classe pour tester le module de comportement comme dans @Martijn 's réponseit_behaves_like 'acts as upload', :csv
it_behaves_like 'an upload', :csv do; subject{ Upload.new(file: some_dummy_file) }; end
Merci pour l'astuce 😛Vous pouviez juste de tester le module implicitement en laissant vos tests dans les classes qui comprennent ce module. Alternativement, vous pouvez inclure d'autres modules nécessaires dans votre classe factice. Par exemple, le
validates
méthodes dans l'AR modèles sont fournis parActiveModel::Validations
. Donc, pour vos tests:Il y a peut être d'autres modules que vous devez apporter en fonction des dépendances vous implicitement comptez dans votre
HasTerms
module.DummyClass
est l'alternative que vous êtes à la recherche pour puis.J'ai eu du mal avec moi-même et évoqué la solution suivante, qui est un peu comme rossta de l'idée, mais utilise une classe anonyme la place:
let(:dummy_class){ Class.new (... ) }
par opposition à l'insertion, à droite dans lesit
bloc.Voici un autre exemple (à l'aide de Factorygirl "créer" la méthode" et shared_examples_for)
préoccupation spec
commentable préoccupation
et restraunt_spec peut ressembler à quelque chose comme ça (je ne suis pas Rspec guru donc ne pense pas que ma façon d'écrire des specs est bon, la chose la plus importante est au début):
Bâtiment sur Aaron K est une excellente réponse ici, il y a quelques astuces intéressantes que vous pouvez utiliser avec
described_class
que RSpec fournit à faire vos méthodes omniprésent et faire des usines de travailler pour vous. Voici un extrait d'un exemple, j'ai récemment fait une demande: