【发布时间】: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