2011-09-28 41 views
0

正確指定模擬對象的屬性在(網絡)應用程序中,我實現了用於分離核心問題的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中)賦值,但是當我對此屬性執行斷言時,賦值始終爲空。

任何人都可以幫我嗎?

親切的問候, 瑞恩。

回答

1

模擬的ICampusListView無法保持指定的數據源對象。這裏有兩種可能的方法來解決這個問題。首先,你可以使用一個存根,而不是一個模擬的(適用於嘲弄和存根之間的區別更多的背景信息,請參閱this後):

_view = MockRepository.GenerateStub(Of ICampusListView)() 

如果你想用嘲笑的,而不是存根,用ExpectVerifyAllExpectations對您的測試中的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)()) 
相關問題