2012-12-20 5 views
1

Je suis novice en programmation, OOP et Test unitaire alors pardonnez-moi pour mon manque de connaissance.Test d'unité d'écriture dans le studio visuel 2010 pour le jeu 'Rock, Paper and Scissors'

Dans le cadre de mon rocher, jeu papier et ciseaux J'ai une superclasse abstraite (arme) qui a sous-classes (Rock, papier et ciseaux) en VB.NET comme:

Public MustInherit Class Weapons 
     Public MustOverride Function compareTo(ByVal Weapons As Object) As Integer 

    End Class 

    Public Class Paper 
     Inherits Weapons 

     Public Overrides Function compareTo(ByVal Weapons As Object) As Integer 
      If TypeOf Weapons Is Paper Then 
       Return 0 
      ElseIf TypeOf Weapons Is Rock Then 
       Return 1 
      Else 
       Return -1 
      End If 
     End Function 
    End Class 

    Public Class Rock 
     Inherits Weapons 

     Public Overrides Function compareTo(ByVal Weapons As Object) As Integer 
      If TypeOf Weapons Is Rock Then 
       Return 0 
      ElseIf TypeOf Weapons Is Scissors Then 
       Return 1 
      Else 
       Return -1 
      End If 
     End Function 
    End Class 

    Public Class Scissors 
     Inherits Weapons 

     Public Overrides Function compareTo(ByVal Weapons As Object) As Integer 
      If TypeOf Weapons Is Scissors Then 
       Return 0 
      ElseIf TypeOf Weapons Is Paper Then 
       Return 1 
      Else 
       Return -1 
      End If 
     End Function 
    End Class 

également un superclasse joueur qui a sous-classes (PlayerComputerRandom, PlayerHumanPlayer et PlayerComputerTactical) comme:

Imports RockPaperScissors.Weapons 

Public Class Player 

    Private pName As String 
    Private pNumberOfGamesWon As String 
    Public pWeapon As Weapons 

    Property Name() As String 
     Get 
      Return pName 
     End Get 
     Set(ByVal value As String) 
      pName = value 
     End Set 
    End Property 

    Property NumberOfGamesWon As String 
     Get 
      Return pNumberOfGamesWon 
     End Get 
     Set(ByVal value As String) 
      pNumberOfGamesWon = value 
     End Set 
    End Property 

    Property getWeapon As Weapons 
     Get 
      Return pWeapon 
     End Get 
     Set(ByVal value As Weapons) 
      pWeapon = value 
     End Set 
    End Property 

    Public Sub pickWeapon(ByVal WeaponType As String) 
     If WeaponType = "Rock" Then 
      pWeapon = New Rock() 

     ElseIf WeaponType = "Paper" Then 
      pWeapon = New Paper() 

     Else 
      pWeapon = New Scissors() 

     End If 

    End Sub 

End Class 



    Imports RockPaperScissors.Weapons 

Public Class PlayerComputerRandom 
    Inherits Player 

    Private Enum weaponsList 
     Rock 
     Paper 
     Scissors 
    End Enum 

    Public Overloads Sub pickWeapon() 

     Dim randomChoice = New Random() 
     Dim CompChoice As Integer = randomChoice.Next(0, [Enum].GetValues(GetType(weaponsList)).Length) 

     If CompChoice = "0" Then 
      pWeapon = New Rock() 

     ElseIf CompChoice = "1" Then 
      pWeapon = New Paper() 

     Else 
      pWeapon = New Scissors() 

     End If 


    End Sub 

End Class 



Public Class PlayerComputerTactical 
    Inherits Player 

    Private plastMove As String 

    Property lastMove() As String 
     Get 
      Return plastMove 
     End Get 
     Set(ByVal value As String) 
      plastMove = value 
     End Set 
    End Property 

    Public Overloads Sub pickWeapon() 
     ' Add tactical player functionality 
    End Sub 


End Class 


    Public Class PlayerHumanPlayer 
     Inherits Player 

    End Class 

J'ai la classe GameForm qui instancie les objets et exécute divers autres logiques utilisés pour le front-end comme indiqué ci-dessous:

Public Class GameForm 
    Private Sub btnRock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRock.Click 
     findWinner("HumanPlayer", "Rock", "RandomComputer") 
    End Sub 

    Private Sub btnPaper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPaper.Click 
     findWinner("HumanPlayer", "Paper", "RandomComputer") 
    End Sub 


    Private Sub btnScissors_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnScissors.Click 
     findWinner("HumanPlayer", "Scissors", "RandomComputer") 
    End Sub 

    Public Sub findWinner(ByVal p1name As String, ByVal p1WeaponSelected As String, ByVal p2Name As String) 
     Dim player1 = New PlayerHumanPlayer() 
     Dim player2 = New PlayerComputerRandom() 

     player1.Name = p1name 
     player1.pickWeapon(p1WeaponSelected) ' Should I be using the Rock Class??? 

     player2.Name = p2Name 
     player2.pickWeapon() 

     Dim winner As Integer = player1.getWeapon().compareTo(player2.getWeapon()) 

     Select Case winner 
      Case 1 
       txtGameStatus.Text = player1.Name() + " wins!" 
      Case -1 
       txtGameStatus.Text = player2.Name() + " wins!" 
      Case 0 
       txtGameStatus.Text = "Draw!" 
     End Select 
    End Sub 

End Class 

J'ai besoin d'écrire des tests unitaires de cette en utilisant visual studio 2010. Comme je ne l'ai jamais fait, je ne sais pas quels tests unitaires je pourrais inclure (mis à part les exemples d'ajout de stand/soustrait). Est-ce que quelqu'un pourrait fournir quelques tests unitaires pour commencer. Cela me donnera un point de départ.

Toute aide serait grandement appréciée.

Manys merci à l'avance

Répondre

1

Pour essayer de vous donner un exemple de la façon dont vous pouvez structurer ceci:

Tout d'abord, au lieu de cela:

Public Overloads Sub pickWeapon() 
    ' Logic...   
End Sub 

Vous voudrez peut-être faire quelque chose comme ceci:

Public Overloads Function pickWeapon() as Weapons 

    Dim selectedWeapon as Weapons = Nothing; 

    // logic to set weapon here 

    return selectedWeapon; 
End Sub 

Maintenant, vous pouvez appeler à partir d'un UnitTest, et assurez-vous qu'il retourne un objet qui est une arme valable, par exemple (pas nécessairement le test le plus utile, mais j'espère que vous comprendrez le point! :)).Si vous restructurez la méthode findWinner() d'une manière similaire, vous pouvez tester que la logique de cette méthode trouve le bon gagnant. Notez toutefois que vous devez séparer la logique de la recherche d'un gagnant de la sélection d'armes. Autrement dit, vous devez créer les joueurs en dehors de cette méthode et les transmettre au findWinner(). Cela vous permettra de passer dans certaines options (armes), et vérifiez que vous obtenez le résultat attendu. Vous ne pouvez pas faire cela pour le moment, puisque l'arme que "player2" utilisera est sélectionnée au hasard à l'intérieur de findWinner().

Commencez par changer de sorte qu'il aura une signature semblable au suivant:

' Takes two players in, and returns the name of the winner 
Public Sub findWinner(ByVal humanPlayer As PlayerHumanPlayer, 
         ByVal computerPlayer As PlayerComputerRandom) As String 

A (très simple) test, en supposant que vous avez réécrit le code pour s'adapter ceci:

<TestMethod()> _ 
Public Sub ShouldReturnPlayer1AsWinner() 

    Dim player1 = New PlayerHumanPlayer("Human name", New Scissors()) 
    Dim player2 = New PlayerComputerRandom("Computer", New Rock()) 

    Dim result As String = findWinner(player1, player2) 

    Assert.AreEqual(result, "Computer") 

End Sub 

Encore une fois, ce n'est peut-être pas le meilleur test, mais il devrait vous donner une idée et vous aider à démarrer.

Sidenote: Je appellerais la super-classe Weapon, pas Weapons. Pensez-y de cette façon: Vous pouvez en avoir beaucoup de différentes instances, et elles peuvent être des armes différentes (papier, ciseaux, etc.), mais chacune est toujours une seule arme.

2

Mon premier conseil serait de changer toutes vos méthodes en fonctions qui renvoient une valeur, ceci est pour les méthodes que vous voulez tester l'appareil. Cela vous permettra d'utiliser la fonction pour un test unitaire.

Je peux vous donner de l'aide pour la structure, mais je crains de ne pas faire vos tests unitaires pour vous! Ill vous montrer un exemple de test unitaire que j'ai dans une solution, il peut ne pas être pertinent pour votre solution mais la structure est là néanmoins. Tout d'abord, j'ai la fonction (ajouter) que je voudrais tester, et dans un projet de test unitaire j'ai le test.

Fonction pour tester

Public Function Add(value1 As Int32, value2 As Int32) 

    answer = value1 + value2 

    Return answer 

End Function 

C'est le test unitaire J'utilise au sein de ma classe de test unitaire

<TestMethod()> _ 
Public Sub AddTest() 

    Dim target As Form1 = New Form1() 
    Dim value1 As Int32 = 10 
    Dim value2 As Int32 = 35 
    Dim actual As Int32 = 45 

    Dim result As Int32 = target.Add(value1, value2) 

    Assert.AreEqual(result, actual) 

End Sub 
Questions connexes