Est-il idiomatiques Ruby pour ajouter une méthode assert( ) de Ruby Noyau de la classe?
Je suis en élargissant mon Ruby compréhension par le codage de l'équivalent de Kent Beck xUnit en Ruby. Python (qui Kent a écrit dans) a une méthode assert() dans la langue qui est largement utilisé. Ruby n'a pas. Je pense qu'il devrait être facile d'ajouter cela, mais est le Noyau le bon endroit pour le mettre?
BTW, je connais l'existence des différents de l'Unité de cadres en Ruby - c'est un exercice pour apprendre le Ruby idiomes, plutôt que de "faire quelque chose".
- J'aime des problèmes à la fois: vous enseigner, et de faire quelque chose. 🙂
Vous devez vous connecter pour publier un commentaire.
Non, c'est pas une bonne pratique. La meilleure analogie à la fonction assert() en Ruby, c'est juste en levant
et vous pouvez mettre en œuvre vos propres exceptions si vous souhaitez fournir aux plus spécifique de la gestion des exceptions
fail if [expr]
, si vous le souhaitez, ce qui lève une Erreur à l'Exécution.fail
est un alias pourraise
, n'est-ce pas? Ils ont tous deux donnerRuntimeError
. (Peut-être que l'un est plus idiomatique?)Je pense que c'est totalement valide pour utiliser affirme en Ruby. Mais vous êtes de mentionner deux choses différentes:
assert
méthodes pour la vérification de vos tests attentes. Ils sont destinés à être utilisés dans votre code de test, pas dans le code de votre application.assert
de construction destinés à être utilisés dans le code de vos programmes, de vérifier les hypothèses que vous avez faites sur leur intégrité. Ces contrôles sont construite à l'intérieur du code lui-même. Ils ne sont pas un test de temps de l'utilitaire, mais un développement à temps.J'ai récemment écrit solid_assert: un peu de Ruby bibliothèque de la mise en œuvre d'un Rubis affirmation de l'utilitaire et aussi un post dans mon blog expliquant sa motivation.. Il vous permettent d'écrire des expressions de la forme:
Et peuvent être désactivées afin
assert
etinvariant
évaluée comme vide consolidés. Ce vous permettre d'éviter tout problème de performance dans la production. Mais remarquez que La Pragmatique Des Programmeurs recommandons contre le désactiver. Vous ne devez les désactiver si ils ont vraiment nuire à la performance.Quant à la réponse en disant que le idiomatiques Rubis moyen est d'utiliser un normal
raise
déclaration, je pense qu'il manque de l'expressivité. L'une des règles d'or d'un ton assuré la programmation n'est pas en utilisant des affirmations pour le mode normal de gestion des exceptions. Ils sont deux choses complètement différentes. Si vous utilisez la même syntaxe pour les deux d'entre eux, je pense que vous le code sera plus obscurs. Et bien sûr, vous perdre la possibilité de le désactiver.Vous pouvez être convaincu que l'utilisation des assertions est une bonne chose, parce que les deux doivent lire les livres classiques comme La Pragmatique Programmeur De Compagnon, de Maître et Le Code Complet consacrer toute une partie d'entre eux, et en recommander l'utilisation. Il y a aussi un article de nice intitulé De la programmation avec les affirmations qui illustrent très bien ce qu'est affirmée la programmation sur et quand l'utiliser (il est basé en Java, mais les concepts s'appliquent à n'importe quelle langue).
Quelle est votre raison de l'ajout de la méthode assert pour le module du Noyau? Pourquoi ne pas simplement utiliser un autre module appelé
Assertions
ou quelque chose?Comme ceci:
Si vous avez vraiment besoin de vos affirmations être disponible partout faire quelque chose comme ceci:
Avertissement: je n'ai pas testé le code, mais en principe, je ferais comme ça.
Object
classe.assert
méthode disponible dans le monde entier. Cependant, je ne conseillerais à personne de singe de correction de ce genre dans la non-jouet projets.Ce n'est pas spécialement idiomatiques, mais je pense que c'est une bonne idée. Surtout si c'est fait comme ceci:
De cette façon, il n'y a pas d'impact si vous décidez de ne pas courir avec de DÉBOGAGE (ou une autre interrupteur pratique, j'ai utilisé le Noyau.do_assert dans le passé) ensemble.
Ma compréhension est que vous êtes en train de rédiger votre propre suite de tests comme un moyen de devenir plus familier avec Ruby. Ainsi, alors que le Test::Unit pourrait être utile comme un guide, ce n'est probablement pas ce que vous cherchez (parce que c'est déjà fait tout le travail).
Cela dit, python affirmer, c'est (pour moi au moins), plus analogue à C assert(3). Il n'est pas spécifiquement conçu pour l'unité des tests, plutôt pour attraper les cas où "cela ne devrait jamais arriver."
Comment Ruby intégré dans les tests unitaires ont tendance à voir le problème, alors, est que chaque classe de cas de test est une sous-classe de Cas de test, et qui comprend un "faire valoir" une déclaration qui vérifie la validité de ce qui a été transmis et les enregistre pour les rapports.