Dans ma question As a “mockist” TDD practitioner, should I mock other methods in the same class as the method under test?, Avdi répondu "Personnellement, je pense que se moquer de soi-même est presque toujours une odeur de code, c'est tester l'implémentation plutôt que le comportement." Il a peut-être raison, mais souvent je ne peux pas distinguer entre la mise en œuvre et le comportement.Comment éviter le code dupliqué dans mes tests et éviter de me moquer de moi-même?
J'ai un autre exemple (en pseudo-code de style Python) qui peut conduire à des réponses utiles:
class Consumer:
def spec_dirpath:
client = VCS.get_connection(self.vcs_client_name)
client.sync()
return client.dirpath()
def spec_filepath:
filepath = os.path.join(spec_dirpath(), self.spec_filename)
if not os.path.exists(filepath):
raise ConsumerException
return filepath
def get_components:
return Components.get_components_from_spec_file(self.spec_filepath())
L'idée ici est que la méthode get_components appelle la méthode spec_filepath afin d'obtenir un chemin vers un fichier que la méthode de classe get_components_from_spec_file va lire une liste de composants. La méthode spec_filepath appelle à son tour spec_dirpath, qui synchronise le répertoire contenant le fichier spec du système VCS et renvoie le chemin d'accès à ce répertoire. (Essayez de ne pas chercher des bugs dans ce code - c'est pseudo-code, après tout.)
Je cherche des conseils sur la façon de tester ces méthodes ...
Test spec_dirpath devrait être assez simple . Je peux mocker la classe VCS et lui faire retourner un objet mock et confirmer que les méthodes appropriées sont appelées (et que la méthode spec_dirpath retourne ce que la méthode dirpath de mock renvoie).
Mais si je ne me moque pas de spec_dirpath lors du test de spec_filepath, comment éviter de dupliquer le même code de test du code spec_dirpath dans le test spec_filepath? Et si je ne me moque pas de spec_filepath lors du test de get_components, comment éviter de dupliquer le code de test depuis spec_filepath et spec_dirpath?