2009-10-29 4 views
1

Je suis en train de prendre en charge un système hérité qui contient un projet d'application console, qui est exécuté en tant que tâche planifiée sur nos serveurs de production. Il produit principalement des rapports quotidiens et hebdomadaires, assure la maintenance de certaines bases de données, etc.Unité testant une application de console de tâches planifiée Windows

Le principal de l'application console gère la saisie des arguments de la ligne de commande et détermine lequel de plusieurs processus différents doit être exécuté. Quelque chose comme

Module MainModule

Public Sub Main() 
    '--- Check if command line arguments were specified 
    Dim args() As String = Environment.GetCommandLineArgs() 
    If args.Length > 1 Then 
     ConsoleMain(args) 
    End If 
End Sub 

Public Sub ConsoleMain(ByVal args() As String) 
    Dim rc As New Coordinator(enableEmails_) 

    Try 
     Dim arg_ As String = args(1) 
     Dim success_ As Boolean = True 

     Select Case arg_.ToUpper() 
      Case TaskType.OrderIntegration 
       success_ = rc.OrderIntegration() 
      Case TaskType.Motivators 
       success_ = rc.MotivatorsCreateFile(New CustomerMotivatorsManager) 

     ... repeat for each of the various "Task Types" 

End Module

ma question est: - Ceci étant une application console avec un Main() et ConsoleMain(), je ne semble pas avoir tout ce que je peux accéder à partir d'un test - à savoir le "Main" et "ConsoleMain" ne semble pas être accessible. Comment puis-je tester unitairement quelque chose comme ça, pour tester le "si l'argument 'x' est passé, la fonction 'y' est appelée"?

Merci à l'avance,

Répondre

1

Je ne sais pas pourquoi principal ne serait pas visible de vos tests, à moins que VB.NET ne des choses derrière les rideaux pour cacher.

Dans tous les cas, pourquoi ne pas déplacer votre code dans sa propre classe? Ensuite, vous pouvez exécuter des tests unitaires sur chaque classe à la fois, plutôt que d'exécuter le tout en même temps.

Les tests unitaires s'exécutent généralement sur des classes individuelles, plutôt que d'exécuter le point d'entrée principal d'une application.

+1

Il semble que cela soit lié au fait que le Main soit dans un "Module" au lieu d'une "classe". Les éléments des autres classes du projet sont visibles, rien dans ce "Module" principal. J'espérais éviter de refactoriser cela, car c'est un travail de production très visible. Cependant, l'extraction de la logique principale dans sa propre classe (qui prend en paramètre les arguments de la ligne de commande) est une possibilité. Merci! –

+0

Cool. Puisque cela vous a conduit dans la bonne direction, allez-vous marquer cela comme la réponse? (Ou au moins me donner un upvote?) Appréciez-le! –

Questions connexes