Свойство assert для смоделированного объекта было назначено правильно с помощью Rhino.Mocks
В (веб) приложении я реализовал шаблон 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 в памяти и заполнение / уничтожение данных в методах настройки / разрыва, но это все было опущено в вышеприведенном примере для простоты.
По сути, в этом модульном тесте я возвращаю реальную NHibernate ISession из симулируемого менеджера сеансов (класс, используемый для управления сеансами - подумайте Castle.Facilities.NHibernateIntegration), так что LINQ-to-NHibernate может / действительно будет возвращать действительные перечисляемые результаты, В любом случае в реализации презентатора я назначаю источник данных представлений (внутри NeedDataSource), но когда я делаю утверждение для этого свойства, назначенное значение всегда равно нулю.
Может кто-нибудь мне помочь?
С наилучшими пожеланиями, Райан.
1 ответ
Высмеянный ICampusListView
не может удержать назначенный объект источника данных. Вот два возможных способа исправить это. Во-первых, вы можете использовать заглушку вместо макета (дополнительную информацию о разнице между заглушками и заглушками см. В этом посте):
_view = MockRepository.GenerateStub(Of ICampusListView)()
Если вы хотите использовать макеты вместо заглушек, используйте Expect
а также VerifyAllExpectations
на 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)())