1

編集

私はたくさんの調査を行い、おそらくこれには部分的なモックを使用したいと結論付けました。これにより、メソッドのモックでどのアプローチを使用するかという問題が生じました。

質問

メソッド内でヘルパー クラスを使用する場合、通常、ヘルパー クラスに含まれていた単体テストの多く (すべてではないにしても) を再実装する必要があります。つまり、機能を更新するたびに、その機能を使用するすべての場所でテストを更新する必要があります。それらは大部分が冗長です(一部の関数名/モックが異なるだけです)。

それを管理する簡単な方法はありますか?

高度に工夫された例

基本的なユーティリティ関数を提供する基本クラスの非常に工夫された例を見てみましょう。

Public MustInherit Class SomeBase
    Public Property WebConnectionService As IWebConnectionService

    Public Overridable ReadOnly Property PortNumber As Integer
        Get
            Return 2352
        End Get
    End Property

    Public Overridable ReadOnly Property Host As String
        Get
            Return "somesite.com"
        End Get
    End Property

    Protected Sub OpenServiceConnection()
        ServiceConnection = WebConnectionService.OpenConnection(Host, PortNumber)
    End Sub
End Class

<TestFixture()> _
Public Class SomeBaseTest
    Private Class SomeBaseImpl
        Inherits SomeBase

        Public Overrides ReadOnly Property PortNumber As Integer
            Get
                Return 1
            End Get
        End Property

        Public Overrides ReadOnly Property Host As String
            Get
                Return "test.host"
            End Get
        End Property

        Public Sub New(w As IWebConnectionService)
            Me.WebConnectionService = w
        End Sub

        Public Sub Open()
            OpenServiceConnection()
        End Sub
    End Class

    <Test()> _
    Public Sub OpenServiceConnection_Should_Open_Connection_On_Set_Host_And_Port()
        Dim w As IWebConnectionService = MockRepository.GenerateMock(Of IWebConnectionService)()
        Dim s As New ServiceBaseImpl(w)

        s.Open()

        w.AssertWasCalled(Sub(wcs) wcs.OpenConnection(s.Host, s.PortNumber))
    End Sub
End Class

実際の基本サービスを実装するときは、おそらく次の行に沿って、接続が開かれたことも確認する必要があります。

Public Class MyClass
    Inherits SomeBase

    Public Function GetData() As MyDataHolderClass
        OpenServiceConnection()

        '... other processing

        Return data
    End Function
End Class

<TestFixture()> _
Public Class MyClassTest
    <Test()> _
    Public Sub GetData_Should_Connect_To_The_Service()
        Dim w As IWebConnectionService = MockRepository.GenerateMock(Of IWebConnectionService)()
        Dim s As New MyClass(w)

        s.GetData()

        w.AssertWasCalled(Sub(wcs) wcs.OpenConnection(s.Host, s.PortNumber))
    End Sub
End Class

MS が実装する素晴らしい機能の提案

本当に、ヘルパーが使用されたことを主張するテストを書きたいと思っています (したがって、ヘルパーで成功したすべてのテストがここにも適用されます)。それが可能かどうかさえわかりません)。

<Test()> _
Public Sub GetData_Should_Call_OpenConnection_Helper()
   Dim s As New ServiceImpl()

   s.GetData()

   s.AssertCalledOpenConnectionHelper()
End Sub
4

0 に答える 0