1

私はプログラミング、OOP、単体テストに慣れていないので、知識が不足していることをお許しください。

Rock、Paper、Scissorsゲームの一部として、VB.NETに次のようなサブクラス(Rock、Paper、Scissors )を持つ抽象的なスーパークラス( Weapon )があります。

    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

また、次のようなサブクラス(PlayerComputerRandomPlayerHumanPlayerPlayerComputerTactical)を持つスーパークラスPlayerがあります。

    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

以下に示すように、オブジェクトをインスタンス化し、フロントエンドに使用される他のさまざまなロジックを実行するGameFormクラスがあります。

    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

Visual Studio 2010を使用して、これの単体テストを作成する必要があります。これを行ったことがないため、どの単体テストを含めることができるかわかりません(スタンドの追加/削除の例を除く)。誰かが開始するために親切にいくつかのユニットテストを提供してもらえますか?それは私に出発点を与えるでしょう。

どんな助けでも大歓迎です。

よろしくお願いします

4

2 に答える 2

2

私の最初のヒントは、すべてのメソッドを値を返す関数に変更することです。これは、単体テストを行うメソッド用です。これを行うと、単体テストにこの関数を使用できるようになります。

私はあなたに構造の助けを与えることができます、しかし私はあなたのためにあなたのユニットテストをするつもりはないのではないかと思います!

私がソリューションに持っている単体テストの例を示します。それはあなたのソリューションに関連していないかもしれませんが、それでも構造はそこにあります。まず、テストしたい関数(add)があり、単体テストプロジェクトでテストがあります。

テストする機能

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

    answer = value1 + value2

    Return answer

End Function

これは、ユニットテストクラスで使用しているユニットテストです。

<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
于 2012-12-20T14:03:00.707 に答える
1

これをどのように構成するかの例を示すために:

まず第一に、これの代わりに:

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

あなたはこのようなことをしたいかもしれません:

 Public Overloads Function pickWeapon() as Weapons

    Dim selectedWeapon as Weapons = Nothing;

    // logic to set weapon here

    return selectedWeapon;
End Sub

これで、UnitTestからそれを呼び出すことができ、たとえば、有効な武器であるオブジェクトが返されることを確認できます(必ずしも最も有用なテストではありませんが、うまくいけば、ポイントが得られます!:))。

同様の方法でメソッドを再構築する場合findWinner()は、そのメソッドのロジックが正しい勝者を見つけることをテストできます。

ただし、勝者を見つけるためのロジックを武器の選択から分離する必要があることに注意してください。つまり、そのメソッドの外部でプレーヤーを作成し、それらをに渡す必要がありfindWinner()ます。これにより、特定のオプション(武器)を渡して、期待どおりの結果が得られることを確認できます。使用する武器「player2」は内部でランダムに選択されているため、現時点ではそれを行うことはできませんfindWinner()

次のような署名を持つように変更することから始めます。

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

これに合うようにコードを書き直したと仮定した場合の(非常に単純な)テスト:

<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

繰り返しになりますが、これは最良のテストではないかもしれませんが、それはあなたにアイデアを与え、あなたが始めるのを助けるはずです。

補足:私はスーパークラスと呼びますがWeapon、ではありませんWeapons。このように考えてください。さまざまなインスタンスを作成でき、それらはさまざまな武器(紙、はさみなど)にすることができますが、それぞれが単一の武器です。

于 2012-12-20T15:37:11.740 に答える