web-dev-qa-db-fra.com

Comment tester des classes abstraites

A utilisé l'outil de création de tests unitaires dans Visual Studio et, évidemment, il tente d'instancier mes classes abstraites.

Ma question est la suivante: devrais-je essayer de tester un peu la méthode utilisée par Visual Studio, ou dois-je créer une classe fictive à instancier, ou devrais-je uniquement tester les méthodes utilisant cette classe abstraite?

Merci.

30
ediblecode

Si certaines méthodes de cette classe abstraite valent la peine d'être testées, vous devez les tester. Vous pouvez toujours sous-classer la classe abstraite pour le test (et la nommer comme MyAbstractClassTesting) et tester cette nouvelle classe concrète.

53
sloth

Il y a deux points de vue opposés:

  • Ne testez pas la classe abstraite elle-même, testez les classes concrètes qui en ont été héritées
  • La classe abstraite doit également être testée car elle fournit une logique intégrée partagée par toutes les classes héritées. Vous ne devez donc tester qu'une fois la logique de base dans la classe abstraite.

Je préfère la deuxième option (actuellement) et tester les classes abstraites avec RhinoMocks PartialMock fonctionnalité qui me permet de créer une maquette d'une classe abstraite.

21
sll
  1. Il suffit de tester les classes d'implémentation. 

  2. Vous pouvez toujours créer une mise en œuvre spécifique pour les tests sans ajouter de fonctionnalités supplémentaires.

  3. Écoutez les tests. L'utilisation d'outils moqueurs magiques permettant de tester des classes abstraites, des méthodes privées, etc. constitue une odeur de code de test.

5
blank

utiliser de mockrepository:

[testmethod]
       public void testwithmockrepository()
       {
           var mockrepository = new rhino.mocks.mockrepository();
           var mock = mockrepository.partialmock<myabstractclass>();

           using ( mockrepository.record() )
           {
               expect.call( mock.dosomething( arg<string>.is.anything ) ).return( "hi..." ).repeat.once();
           }
           using ( mockrepository.playback() )
           {
               assert.areequal( "hi..." , mock.dosomething( "salam" ) );
           }
       }
0
mohammad almasi