【问题标题】:assert property of mocked object has been assigned correctly using Rhino.Mocks已使用 Rhino.Mocks 正确分配了模拟对象的断言属性
【发布时间】:2011-09-28 04:15:29
【问题描述】:

在(网络)应用程序中,我实现了 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

(简化的)基本presenter类如下:

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

我正在尝试使用 NUnit 和 Rhino Mocks 对我的演示者(特别是 LINQ 查询)进行单元测试。在上述 CampusListPresenter 的单元测试用例中,我将模拟视图传递给演示者。本质上,我想对这个模拟视图对象执行一个断言,以确认 Datasouce 属性设置正确。但是,这始终为 null。

我的单元测试的一个(简化)示例如下(了解我对正确的单元测试比较陌生):

<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 数据库并在设置/拆卸方法中填充/销毁数据,但为了简单起见,上述示例中都省略了这些。

基本上,在这个单元测试中,我从一个模拟的会话管理器(一个用于会话管理的类 - 想想 Castle.Facilities.NHibernateIntegration)返回一个真正的 NHibernate ISession,以便 LINQ-to-NHibernate 可以/实际上返回有效的可枚举结果。无论如何,在演示者实现中,我分配了视图数据源(在 NeedDataSource 中),但是当我对此属性进行断言时,分配的值始终为 null。

谁能帮帮我?

亲切的问候, 瑞恩。

【问题讨论】:

    标签: unit-testing nunit rhino-mocks mvp linq-to-nhibernate


    【解决方案1】:

    模拟的ICampusListView 无法保持分配的数据源对象。这里有两种可能的方法来解决这个问题。首先,您可以使用存根代替模拟(有关模拟和存根之间区别的更多背景信息,请参阅this 帖子):

    _view = MockRepository.GenerateStub(Of ICampusListView)()
    

    如果您确实想使用模拟而不是存根,请在测试中的 ICampusListView 对象上使用 ExpectVerifyAllExpectations

        '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)())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多