2009-09-29 1 views
1

Comment devrais-je tester le code suivant?Comment testez-vous une classe référencée qui effectue des opérations internes?

Public Sub SetSerialIdForDevice() 
     Try 
      Dim component As Object = container.getComponentRef("componentInterface") 
      If component IsNot Nothing Then 
       component.SetupDeviceSerialID(container.serialNumbers) 
      Else 
       serialfound = False 
      End If 
      Catch ex As Exception 
      '' error handling 
     End Try 
    End Sub 

Les références de projet (ou les composants comme on les appelle ici) sont chargées à l'exécution dans un 'conteneur' singleton. Nous appelons le composant qui s'interface avec un périphérique en utilisant le container.getComponentRef("< name of component we're looking for >"). Nous invoquons ensuite une méthode sur ce composant pour définir l'identifiant série, qui est stocké dans une propriété de l'objet conteneur.

Dans la méthode SetupDeviceSerialID(), nous appelons les propriétés natives du conteneur (comme s'il s'agit d'un mode de débogage interne) ainsi que d'autres objets. Quelle serait la meilleure façon de tester ce scénario où nous avons des objets dans des objets? Serions-nous moquer tous les appels, propriétés et objets afin d'isoler le test de SetupDeviceSerialID()?

Ou est-ce que nous nous moquons du 'componentInterface' retourné et simulons l'appel pour SetupDeviceSerialID(), puis testez les propriétés qui ont été modifiées dans SetupDeviceSerialID()?

EDIT

J'ai pensé à tester ce mal (évidemment) et par les réponses que je me suis rendu compte que je cherchais à entasser des tests pour les méthodes exécutées plus profondément dans le code, dans les tests pour la méthode SetSerialIdForDevice().

Ainsi, en conséquence, Si un serialID se trouve, nous fixerait serialfound = true à l'intérieur de SetupDeviceSerialID().
Est-ce quelque chose que nous tester ici (puisque nous allons tester pour serialfound=false), ou dans un test pour SetupdDeviceSerialID()? Et allons-nous créer un test pour voir si SetupDeviceSerialID() existe réellement sur le composant "componentInterface"?

Répondre

1

Les mores Les coutures vous pouvez mettre dans votre code, plus il devient facile de tester. Si vous pouvez remplacer la valeur de retour de la méthode getComponentRef par un double de test, vous pouvez écrire un test qui vérifie que cette méthode a été invoquée correctement, puis passer à l'écriture d'autres tests unitaires qui vérifient autre chose.

Idéalement, vous ne devez écrire qu'un test qui teste un comportement particulier.

En supposant que vous pouvez remplacer la variable component par un double de test, vous pouvez ensuite vérifier que la méthode SetupDeviceSerialID est appelée correctement. Cela, ainsi que certains tets qui exercent les chemins d'erreur, devraient alors conclure la suite de tests pour la méthode SetSerialIdForDevice.

Vous pouvez ensuite passer à l'écriture d'un nouvel ensemble de tests qui vérifie qu'une implémentation de composant particulière fonctionne comme prévu, mais il s'agit de tests distincts indépendants des tests qui appliquent la méthode SetSerialIdForDevice.

2

Je me moquerais de container pour que le getComponentRef renvoie un objet simulé que la méthode peut tester. Se moquer de chaque classe "componentInterface" doit être quelque chose qui se passe dans leurs propres tests unitaires dédiés. Ne combinez pas les responsabilités de test parce que c'est pratique, gardez tout comme votre propre unité, donc aucun test d'unité ne dépend d'un autre test.

Questions connexes