Свойство assert для смоделированного объекта было назначено правильно с помощью Rhino.Mocks

В (веб) приложении я реализовал шаблон MVP для разделения основных проблем. Мои докладчики напрямую запрашивают базу данных, используя LINQ-to-NHibernate, или иногда они используют объекты запроса, когда запрос становится сложным (но я отвлекся).

Вот простой пример одного из моих докладчиков (примечание: VB.NET - это не мои предпочтения, а требование для этого):

Public Class CampusListPresenter
    Inherits BasePresenter(Of ICampusListView)

    Public Sub New(ByVal view As ICampusListView)
        MyBase.New(view)
    End Sub

    Public Sub NeedDataSource()

        Using uow As ISession = _sessionManager.OpenSession()

            _view.DataSource = uow.Queryable(Of Campus)() _
            .Cacheable() _
            .AsEnumerable()

        End Using

    End Sub

End Class

(Упрощенный) базовый класс докладчика выглядит следующим образом:

Public MustInherit Class BasePresenter(Of TView)

    Protected _view As TView

    Protected _sessionManager As ISessionManager

    Public Sub New(ByVal view As TView)
        Guard.Against(view Is Nothing, "view cannot be null.")
        _view = view
    End Sub

    Public WriteOnly Property SessionManager As ISessionManager
        Set(ByVal value As ISessionManager)
            _sessionManager = value
        End Set
    End Property

End Class

Я пытаюсь провести модульное тестирование своих докладчиков (в частности, запросов LINQ), используя NUnit и Rhino Mocks. В моем модульном тестовом примере для вышеупомянутого CampusListPresenter я передаю имитируемый вид докладчику. По сути, я хочу выполнить утверждение для этого объекта с поддельным представлением, чтобы убедиться, что свойство Datasouce установлено соответствующим образом. Тем не менее, это всегда ноль.

(Упрощенный) пример моего модульного тестирования выглядит следующим образом (понимаю, что я относительно новичок в правильном модульном тестировании):

<TestFixture()> _
Public Class CampusListPresenterTests

    Dim _realSessionManager As ISessionManager

    <TestFixtureSetUp()> _
    Public Sub TestFixtureSetUp()
        _realSessionManager = DefaultSessionManager.Instance
    End Sub

    Dim _view As ICampusListView
    Dim _fakeSessionManager As ISessionManager

    <SetUp()> _
    Public Sub Setup()
        _view = MockRepository.GenerateMock(Of ICampusListView)()
        _fakeSessionManager = MockRepository.GenerateMock(Of ISessionManager)()
    End Sub

    <Test()> _
    Public Sub NeedDataSource_UsingRealSession_DataSourceIsAssigned()

        'Arrange
        Dim realSession As ISession = _realSessionManager.OpenSession()
        _fakeSessionManager.Expect(Function(sm) sm.OpenSession()).Return(realSession)

        'Act
        Dim presenter As New CampusListPresenter(_view)
        presenter.SessionManager = _fakeSessionManager
        presenter.NeedDataSource()

        'Assert
        _fakeSessionManager.VerifyAllExpectations()
        Assert.AreEqual(_view.DataSource, realSession.Queryable(Of Campus)())

    End Sub

End Class

Я фактически настроил свои модульные тесты на использование базы данных SQLite в памяти и заполнение / уничтожение данных в методах настройки / разрыва, но это все было опущено в вышеприведенном примере для простоты.

По сути, в этом модульном тесте я возвращаю реальную NHibernate ISession из симулируемого менеджера сеансов (класс, используемый для управления сеансами - подумайте Castle.Facilities.NHibernateIntegration), так что LINQ-to-NHibernate может / действительно будет возвращать действительные перечисляемые результаты, В любом случае в реализации презентатора я назначаю источник данных представлений (внутри NeedDataSource), но когда я делаю утверждение для этого свойства, назначенное значение всегда равно нулю.

Может кто-нибудь мне помочь?

С наилучшими пожеланиями, Райан.

1 ответ

Решение

Высмеянный ICampusListView не может удержать назначенный объект источника данных. Вот два возможных способа исправить это. Во-первых, вы можете использовать заглушку вместо макета (дополнительную информацию о разнице между заглушками и заглушками см. В этом посте):

_view = MockRepository.GenerateStub(Of ICampusListView)()

Если вы хотите использовать макеты вместо заглушек, используйте Expect а также VerifyAllExpectations на ICampusListView объект в вашем тесте:

    'Arrange
    Dim realSession As ISession = _realSessionManager.OpenSession()
    _fakeSessionManager.Expect(Function(sm) sm.OpenSession()).Return(realSession)
    _view.Expect(Function(v) v.SetDataSource(Arg(Of DataSource).Is.Anything))

    'Act
    Dim presenter As New CampusListPresenter(_view)
    presenter.SessionManager = _fakeSessionManager
    presenter.NeedDataSource()

    'Assert
    _fakeSessionManager.VerifyAllExpectations()
    _view.VerifyAllExpectations()
    Assert.AreEqual(_view.DataSource, realSession.Queryable(Of Campus)())
Другие вопросы по тегам