正確指定模擬對象的屬性在(網絡)應用程序中,我實現了用於分離核心問題的MVP模式。我的演示者直接使用LINQ-to-NHibernate查詢數據庫,或者有時他們在查詢變得複雜時使用查詢對象(但我離題了)。使用Rhino.Mocks
我的主持人之一的一個簡單的例子是如下(注意: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
我想單元測試使用NUnit和Rhino Mocks的演示者(特別是LINQ查詢)。在上述CampusListPresenter的單元測試案例中,我向演示者傳遞了一個模擬視圖。基本上我想對這個模擬視圖對象執行一個斷言來確認Datasouce屬性被正確設置。但是,這總是空。我的單元測試的
A(簡化)示例如下(瞭解我是比較新的合適的單元測試):
<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方法中填充/銷燬數據,但爲簡化起見,上面的例子中已經省略了這些。
基本上,在這個單元測試中,我從模擬會話管理器(一個用於會話管理的類 - 想想Castle.Facilities.NHibernateIntegration)返回一個真正的NHibernate ISession,以便LINQ-to-NHibernate可以/實際返回有效的可枚舉結果。無論如何,在演示實現中,我將視圖數據源(在NeedDataSource中)賦值,但是當我對此屬性執行斷言時,賦值始終爲空。
任何人都可以幫我嗎?
親切的問候, 瑞恩。