Как настроить возвращаемое значение для свойства только для чтения, используя RhinoMocks в VB.NET?

Я использую RhinoMock в VB.NET, и мне нужно установить возвращаемое значение для списка только для чтения.

Вот что я хочу сделать (но не работает):

dim s = Rhino.Mocks.MockRepository.GenerateStub(of IUserDto)()
s.Id = guid.NewGuid
s.Name = "Stubbed name"
s.Posts = new List(of IPost)

При компиляции происходит сбой, поскольку Posts является свойством только для чтения.

Затем я попробовал лямбда-выражение, которое отлично работает для вызовов функций, но не для свойств. Это не удается скомпилировать.

s.Stub(Function(x As IUserDto) x.Posts).Return(New List(Of IPost))

Следующая (неудачная) попытка состояла в том, чтобы использовать SetupResults, но это не удалось, заявив, что его нельзя использовать в режиме воспроизведения.

Rhino.Mocks.SetupResult.For(s.Posts).Return(New List(Of IPost))

Что возвращает меня к моему вопросу:

Как настроить возвращаемое значение для свойства только для чтения с помощью RhinoMocks в VB.NET?


person Rick    schedule 06.07.2009    source источник
comment
Почему именно Rhino.Mocks.SetupResult.For(s.Posts).Return(New List(Of IPost)) не удался?   -  person Grzenio    schedule 07.07.2009
comment
Не удалось, заявив, что это недействительно в режиме воспроизведения   -  person Rick    schedule 07.07.2009
comment
Не могли бы вы предоставить больше кода? Похоже, вы могли смешивать новый синтаксис AAA со старой методологией записи-воспроизведения, что не помогло бы. Я не знаком с VB.NET, но заглушить свойство только для чтения (т.е. свойство без установщика) можно очень легко сделать на С#.   -  person jpoh    schedule 07.07.2009
comment
Кстати, как провалилась ваша попытка лямбда-выражения? Тест провалился или код не скомпилировался?   -  person jpoh    schedule 07.07.2009
comment
Да, я смешивал AAA и Record/Playback. Я цеплялся за любую доступную соломинку. Я новичок в использовании макетов, и стиль AAA мне больше подходит, но я сделаю все, что сработает. Лямбда (s.Stub(Function....) терпит неудачу при компиляции.   -  person Rick    schedule 07.07.2009


Ответы (1)


Является ли IUserDto интерфейсом? Если это так, то он должен просто работать. Если это не так, проблема может заключаться в том, что рассматриваемое свойство только для чтения не может быть переопределено. RhinoMocks может имитировать только те свойства/методы, которые определены в интерфейсе или могут быть переопределены.

Вот моя (неуклюжая) попытка доказать, что лямбда-синтаксис должен работать:

Imports Rhino.Mocks

Public Class Class1

    Public Sub Test()
        Dim s = MockRepository.GenerateMock(Of IClass)()
        Dim newList As New List(Of Integer)

        newList.Add(10)

        s.Stub(Function(x As IClass) x.Field).Return(newList)

        MsgBox(s.Field(0))

    End Sub

End Class

Public Class AnotherClass
    Implements IClass

    Public ReadOnly Property Field() As List(Of Integer) Implements IClass.Field
        Get
            Return New List(Of Integer)
        End Get
    End Property
End Class

Public Interface IClass
    ReadOnly Property Field() As List(Of Integer)
End Interface

то есть я бы получил окно сообщения с отображаемым на нем номером 10 (я не стал пытаться подключить к нему инфраструктуру модульного тестирования, но это не должно иметь значения), когда вызывается Class1.Test.

Надеюсь, это поможет (во всяком случае, это было интересное упражнение по работе с RhinoMocks в VB.NET).

person jpoh    schedule 08.07.2009