В (веб) приложении я реализовал шаблон 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), но когда я делаю утверждение для этого свойства, назначенное значение всегда равно нулю.
Может кто-нибудь мне помочь?
ВидС уважением, Райан.