Pour apporter un exemple précis, je PromoCode
racine globale qui se compose de PromoCodeUsage
entité qui est uniquement contrôlée par cette AR, de sorte que certaines méthodes sur AR sont simplement déléguées à cette entité, comme:Comment tester les méthodes de la racine agrégée qui délègue juste son appel à l'entité AR?
public function useFor(Order $order): void
{
$this->promoCodeUsage->useFor($order);
}
Et certains d'entre eux sont en partie déléguée, comme:
public function applyFor(Order $order): void
{
if (!$this->published) {
throw new NotPublishedPromoCodeCanNotBeApplied();
}
$this->promoCodeUsage->applyFor($order);
}
Ma suite de tests couvre entièrement tous les comportements PromoCode
y compris PromoCodeUsage
fonctionnalité, car à cette itération il n'y avait pas PromoCodeUsage
et la logique a été mélangé à PromoCode
. Puis j'ai refacturé une partie de cette logique en PromoCodeUsage
. Cette suite de tests pour PromoCode
a eu de nombreux tests et j'étais heureux de pouvoir le diviser aussi (mais ça a bien fonctionné même après avoir séparé des entités). J'ai donc créé une autre suite de tests (PromoCodeUsageTest
), où j'ai déplacé une partie des tests de PromoCode.
Mais PromoCodeUsageTest
s testent l'entité PromoCodeUsage
par le biais du comportement de PromoCode
, de la même manière que dans le test d'origine avant la division. Ils ne touchent pas PromoCodeUsage
directement. Maintenant, j'ai PromoCodeTest
suite avec: et suite PromoCodeUsageTest avec:
Mais il est en quelque sorte bizarre, que 1) PromoCodeTest
Je laisse de côté certains tests (qui sont d'ailleurs) et 2) PromoCodeUsageTest
Je suis en fait pas touchant PromoCodeUsage
entité. 3) J'utilise le modèle de Roy Osherove pour le nommage des tests, et je ne sais pas quel nom de méthode dois-je utiliser dans le nom du test - à partir de PromoCode ou de PromoCodeUsage? Dans mon cas, ils sont identiques, mais ils pourraient différer et cette idée sent.
Si je réécris PromoCodeUsageTest
s pour tester directement l'entité PromoCodeUsage
, je me retrouve avec des méthodes non couvertes sur PromoCode
(qui sont simplement déléguées à PromoCodeUsage
). Donc, cela me ramène à mon approche pour tester PromoCodeUsage
à PromoCode
AR. Oncle Bob (et autres) dit que c'est une bonne habitude de tester le comportement, pas API. Mon approche est-elle conforme à cela? Parce que je sens de l'odeur dans mon approche, n'est-ce pas? Comment faire mieux?
http://stackoverflow.com/a/153565/54734 – VoiceOfUnreason
* "dans PromoCodeUsageTest Je ne suis pas en train de toucher l'entité PromoCodeUsage" * - pas même dans les assertions? – guillaume31
@ guillaume31 Non, je revendique par AggregateRoot. Et aussi, je ne prétends pas trop, je n'ai plutôt aucune assertion à savoir, que l'action peut être effectuée sans lancer d'exception/erreur quand j'ai déjà testé tous les cas qui suscitent l'exception attendue. Parce que j'ai découvert, je devrais avoir des getters sur mes entités seulement pour être capable d'effectuer ces affirmations et je pense que c'est mauvais, non seulement parce que j'ai des méthodes pour les tests seulement, mais parce que je testerais l'API plutôt que le comportement. – Tom