2

VB.Net で RhinoMocks を使用して 1 つのメソッドをモックするにはどうすればよいですか? 私が見つけた参照はC#にあります:

 Expect.Call(delegate{list.Add(0);}).IgnoreArguments() 
     .Do((Action<int>)delegate(int item) { 
     if (item < 0) throw new ArgumentOutOfRangeException(); 
 }); 

SharpDevelop はこれを次のように変換します。

Expect.Call(Function() Do
            list.Add(0)
            End Function).IgnoreArguments().Do(DirectCast(Function(item As Integer) Do
                        If item < 0 Then
                            Throw New ArgumentOutOfRangeException()
                        End If
                       End Function, Action(Of Integer)))

しかし、それも機能しません (コンパイルされません)。

これが私がやりたいことです: 新しいオブジェクトを作成し、そのメソッドのいくつかのプロパティを設定するメソッドを呼び出します。実際には、このメソッドは、データベースで見つかった値をプロパティに取り込みます。テストでは、このメソッドをカスタム メソッド/デリゲートでモックして、(データベースにアクセスせずに) 自分でプロパティを設定できるようにしたいと考えています。

疑似コードでは、これが私がやろうとしていることです:

 Dim _lookup As LookUp = MockRepository.GenerateMock(Of LookUp)()
 _luvalue.Expect(Function(l As LookUp) l.GetLookUpByName("test")).Do(Function(l As LookUp) l.Property = "value")
4

2 に答える 2

3

残念ながら、サブ ラムダとステートメント ラムダの両方を実行しようとしています。どちらも VS2008 ではサポートされていません (ただし、VS の次のバージョンではサポートされる予定です)。VBで動作する拡張バージョンは次のとおりです

私は m_list のタイプを推測しています

Class MockHelper
  Dim m_list as new List(Of Object)

  Public Sub New() 
    Expect(AddressOf CallHelper).IgnoreArguments().Do(AddressOf Do Hepler)
  End Sub

  Private Sub CallHelper() 
    m_list.Add(0)
  End Sub

  Private Sub DoHelper(ByVal item as Integer)
    if item < 0 Then
      Throw New ArgumentOutOfRangeException
    End If
  End Sub
End Class
于 2009-02-13T13:43:40.957 に答える
1

私はデリゲートとラムダの両方を使って何かをモックしたことがないので、この問題を完全に解決することはできませんが、Rhino Mocks 3.5 の通常の「AssertWasCalled」関数のコード例を vb 開発者向けに共有したいと思いました。私はこれを理解しようとしてしばらく時間を費やしました...(以下は簡潔にするために単純に保たれていることに注意してください)

これはテスト対象のメソッドです。ユーザー オブジェクトのサービス クラス内にある可能性があります。

Public Sub DeleteUserByID(ByVal id As Integer) Implements Interfaces.IUserService.DeleteUserByID
      mRepository.DeleteUserByID(id)
End Sub

これは、リポジトリ メソッドが呼び出されることをアサートするための対話型テストです。

  <TestMethod()> _
  Public Sub Should_Call_Into_Repository_For_DeleteProjectById()
    Dim Repository As IUserRepository = MockRepository.GenerateStub(Of IUserRepository)()
    Dim Service As IUserService = New UserService(Repository)

    Service.DeleteUserByID(Nothing)

    Repository.AssertWasCalled(Function(x) Wrap_DeleteUserByID(x))
  End Sub

これは、これがvbで確実に機能するようにするために使用されるラップ関数です

  Function Wrap_DeleteUserByID(ByVal Repository As IUserRepository) As Object
    Repository.DeleteUserByID(Nothing)

    Return Nothing
  End Function

これは非常に厄介な解決策であることがわかりましたが、同じ問題を抱えている人を助けるなら、これを投稿するのにかかった時間の価値がありました;)

于 2009-02-13T14:18:42.417 に答える