Compte tenu du code ci-dessous:
(1) Comment allez-vous écrire une spécification pour tester: allec_nil => False option? P>
(2) vaut même la peine d'écrire une spécification à Test? p>
it { should delegate(:name).to(:league).with_options(:prefix => true, :allow_nil => false) }
3 Réponses :
Selon la documentation du Si l'objet délégué est nul, une exception est soulevée et que cela se produit, que NIL répond à la méthode déléguée. Vous pouvez obtenir un nil à la place de l'option: allecter_nil. P>
blockQuote> Je créerais un objet d'événement Je ne suis pas sûr si cela dispose de cette construction, bien qu'il Certains articles, un peu vieux, sur la manière de procéder à ce comportement dans le devoir . P> i Pensez que cela vaut la peine de tester s'il s'agit d'un comportement que les utilisateurs de cette classe peuvent s'attendre ou supposeront-ce que je pense, ce qui est probablement vrai dans ce cas. Je n'établirais pas à tester "devrait déléguer", car cela semble plus dépendant de la mise en œuvre: vous dites vraiment que votre événement devrait soulever une exception si vous essayez d'appeler Construisez vos tests basés sur la manière dont votre code se comporte, pas sur la façon dont il est construit - Tests de cette façon est une meilleure documentation pour ceux qui trébuchent dans vos tests, comme ils sont plus intéressés par la question "Pourquoi mon événement se lance-t-il?" ou "ce qui peut causer un événement à lancer?" que "est cet événement déléguant?". P> Vous pouvez mettre en évidence ce type de situation en imaginant les échecs pourraient arriver si vous modifiez votre code de manière à ce que les utilisateurs de l'événement ne soient pas fidèles. S'ils ne se soucient pas de cela, le test ne devrait pas casser lorsque vous le changez. Et si vous voulez, par exemple, gérer vous-même la délégation vous-même, en écrivant une fonction Quoi qu'il en soit, c'est tout simplement parler de Soapbox Talk. TL; DR: Testez-le si c'est un comportement quelqu'un pourrait compter sur. Tout ce qui n'est pas testé est le chat de Shroeder: cassé et non cassé en même temps. Honnêtement, une grande partie du temps, cela peut être ok: c'est une question de goût si vous voulez dire quelque chose de rigoureux et définitif sur la manière dont le système devrait se comporter ou simplement le laisser être "comportement non spécifié". P> P > Délégué Code> Module Rails:
événement code> avec un nil
ligue code> ou définir
event.league = nil code>, puis essayez Appeler
Event.name code> et vérifiez qu'il augmente une exception, car c'est ce qui est censé se produire lorsque
allaite_nil code> est faux (qui est également la valeur par défaut). Je sais que RSPEC a cet idiome pour tester des exceptions: p>
#name code> quand Il a une ligue nulle em>. Il est vraiment sans importance des utilisateurs de l'événement comment vous faites cela. Je voudrais même aller jusqu'à présent, si vous souhaitez affirmer et prendre une note de ce comportement, de tester que
Nom de l'événement code> a la même sémantique que
League # nom code>, < em> sans em> mentionner quoi que ce soit sur
délégué code>, étant donné qu'il s'agit d'une approche centrée sur le comportement. p>
#Name code> qui se connecte ou incrémente d'abord un compteur et puis em> délégués à
League < / code>? En testant le comportement d'élevage des exceptions, vous êtes protégé de ce changement, mais en testant si l'événement est un délégué, vous allez casser ce test lorsque vous effectuez ce changement - et votre test ne cherchait pas ce qui est vraiment EM> Important de l'appel à
#name code>. P>
Vous devrez tester l'exception est un runtimeError autrement, tout simplement pas déléguera une méthode non trouvée.
Donc, deux choses ici sur le fait de tester ceci: p>
1) Je ne pense pas qu'il y ait quelque chose de mal avec spécification de ce comportement. Si vous avez des utilisateurs qui ont besoin d'apprendre votre logiciel / votre bibliothèque, il est souvent très utile de vous assurer que toutes vos méthodes faisant partie de votre contrat de configuration publique sont spécifiques. Si vous ne voulez pas faire cette partie de l'API de ce modèle, je pourrais vous recommander de faire la délégation manuellement de ne pas exposer plus de méthodes au monde extérieur que nécessaire. P>
2) Les spécifications de ce type aident à garantir que le contrat que vous avez avec l'objet, votre délégation reste appliquée. Ceci est particulièrement utile si vous utilisez des talons et que vous vous moquez de vos tests, car ils mettent souvent la mise en œuvre du même contrat. Au moins, vous êtes au courant lorsque ce contrat change. P>
En termes de la manière dont vous testez la partie allait_nil, je suis d'accord avec Matt, la meilleure idée est de vous assurer que la ligue est nulle, puis essayez d'appeler le nom de la ligue. Vous pouvez tester pour vous assurer que NIL est retourné. p>
J'espère que cela aide. P>
J'aurais testé la délégation, car l'efficacité que nous avons créée est un contrat entre deux classes
Vous voudrez peut-être examiner cela - quelqu'un d'autre a fait le travail pour vous. gist.github.com/txus/807456