Как макетировать метод (пользовательское поведение) с помощью Rhino Mocks в VB.NET - PullRequest
2 голосов
/ 13 февраля 2009

Как я могу издеваться над одним методом с RhinoMocks в VB.Net? Ссылка, которую я нашел, находится в 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")

Ответы [ 2 ]

3 голосов
/ 13 февраля 2009

К сожалению, вы пытаетесь выполнить и лямбду-подкласс, и лямбду-выражение. Ни один из них не поддерживается в 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
1 голос
/ 13 февраля 2009

Я никогда не издевался над чем-то с делегатом и лямбдой, поэтому я не могу дать полного решения этой проблемы, но я хотел бы поделиться некоторым примером кода для обычной функции "AssertWasCalled" в Rhino Mocks 3.5 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

Это функция обтекания, используемая для обеспечения работы w / vb

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

    Return Nothing
  End Function

Я нашел, что это очень неприятное решение, но если оно поможет кому-то с теми же проблемами, что и у меня, оно того стоило, сколько времени понадобилось, чтобы опубликовать это;)

...