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

В (веб) приложении я реализовал шаблон 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 в памяти и заполняют / уничтожают данные в методах setup / teardown, но все это было опущено в вышеприведенном примере для простоты.

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

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

ВидС уважением, Райан.

1 Ответ

1 голос
/ 28 сентября 2011

Поддельный 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)())
...