編集
私はたくさんの調査を行い、おそらくこれには部分的なモックを使用したいと結論付けました。これにより、メソッドのモックでどのアプローチを使用するかという問題が生じました。
質問
メソッド内でヘルパー クラスを使用する場合、通常、ヘルパー クラスに含まれていた単体テストの多く (すべてではないにしても) を再実装する必要があります。つまり、機能を更新するたびに、その機能を使用するすべての場所でテストを更新する必要があります。それらは大部分が冗長です(一部の関数名/モックが異なるだけです)。
それを管理する簡単な方法はありますか?
高度に工夫された例
基本的なユーティリティ関数を提供する基本クラスの非常に工夫された例を見てみましょう。
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