On the face of it, it looks right. Please create a small test project to show the problem
On Jul 22, 5:46 am, TheMightyKumquat <[email protected]> wrote: > I have an app written in the Model-View-Presenter pattern that I'm > testing. I am getting an exception in my test code at run-time for the > Presenter: "previous method requires a return value or an exception to > throw." This is associated with a Controller class that is a property > of the Presenter. The Controller is defined with generics. I'm both a > novice with Generics and with Rhino Mocks, and I’m stumped as to how I > can fix this error. Can anyone help, please? > > The class I'm testing: > Public Class ClientSearchResultsPresenter > Inherits Presenter(Of IClientSearchResultsView) > > Public Sub New(<Dependency()> ByVal controller As > IClientSearchController) > > _controller = controller > End Sub > > Private _controller As IClientSearchController > Public ReadOnly Property Controller() As > IClientSearchController > Get > Return _controller > End Get > End Property > > Public Overrides Sub OnViewLoaded() > > AddHandler View.SelectedIndexChanged, AddressOf > View_SelectedIndexChanged > AddHandler View.SelectedPageChanged, AddressOf > View_SelectedPageChanged > > LoadSummaryOnView() > View.SelectedPage = Controller.SelectedPage > End Sub > > Private Sub View_SelectedIndexChanged(ByVal sender As Object, > ByVal e As EventArgs) > > Controller.SetSelectedSearchResult(View.SelectedIndex) > End Sub > > Private Sub View_SelectedPageChanged(ByVal sender As Object, > ByVal e As EventArgs) > > Controller.SelectedPage = View.SelectedPage > End Sub > > Private Sub LoadSummaryOnView() > > View.Summary = > Controller.SummaryDocument.ClientSearchSummaryFieldsCollection > End Sub > > End Class > > The test code: > <TestMethod()> _ > Public Sub ClientSearchResultsPresenter_OnViewLoadedTest() > ' OnViewLoaded in the presenter does the following: > ' - adds event handlers for the View's SelectedIndexChanged > and SelectedPageChanged events > ' - calls the private function LoadSummaryOnView, which calls > a Controller method and assigns the result to the View.Summary > property in the presenter > ' - sets the View.SelectedPage property to the > Controller.SelectedPage property. > > ' Mock a controller > Dim mockController As IClientSearchController > mockController = mocks.StrictMock(Of IClientSearchController) > () > Dim target As ClientSearchResultsPresenter = New > ClientSearchResultsPresenter(mockController) > > ' when the presenter calls its LoadKeyOnView method, it will > assign to the View.Summary property. Set up expectation for this write- > only property > Dim fakeSummary As New ClientSearchSummaryDocument() > fakeSummary.ClientSearchSummaryFieldsCollection.Add(New > ClientSearchSummaryDocument.ClientSearchSummaryFieldsDocument()) > > ' The onViewLoaded method will access a method on the > presenter's View property, > ' so we need to mock one up. > Dim mockView As IClientSearchResultsView > mockView = mocks.StrictMock(Of IClientSearchResultsView)() > > ' set up expectation that during the test, the Presenter being > tested will add a > ' handler to the View's events and that this event handler > will not be null > AddHandler mockView.SelectedIndexChanged, Nothing > LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull()) > AddHandler mockView.SelectedPageChanged, Nothing > LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull()) > > ' set up expectation that view.Summary will be written to > mockView.Summary = > fakeSummary.ClientSearchSummaryFieldsCollection > > ' set expectation that View.SelectedPage will be called > Rhino.Mocks.Expect.Call(mockView.SelectedPage).Return(0) > ' set expectation that Controller.SelectedPage will be called > Rhino.Mocks.Expect.Call(mockController.SelectedPage).Return(0) > > target.View = mockView > > ' set expectation that controller's property will be called - > ERROR OCCURS HERE > Rhino.Mocks.Expect.Call(mockController.SummaryDocument).Return > (fakeSummary) > > mocks.ReplayAll() > > target.OnViewLoaded() > > ' verify that all expectations set up for this test have been > met on all mock objects > mocks.VerifyAll() > Assert.IsTrue(target.View.SelectedPage = > target.Controller.SelectedPage) > > End Sub > > The error message can mean that you’ve forgotten to call Replay on the > object you’re setting the expectation > on.http://codemonkey.nmonta.com/2008/09/19/previous-method-requires-a-re... > Not the case here – I’ve got ReplayAll in the test’s code, and > besides, I’m getting an exception on the line when I call Expect.Call, > not when the test method runs. > > It can also mean that you’re defining the wrong data type for the > Expect.Call to > return.http://lexicalclosures.blogspot.com/2008/09/cryptic-rhino-mock-except.... > I think this is what’s happening here. > > My Controller’s Interface is defined using Generics – code is this: > > ''' <summary> > ''' Interface for the client registration client search > controller. > ''' </summary> > Public Interface IClientSearchController > Inherits IController(Of ClientSearchKeyDocument, > InteractionDocumentBase, ClientSearchSummaryDocument) > > ' search > > ''' <summary> > ''' Returns the current search details to display on the > client search view. > ''' </summary> > ''' <returns>Current search details to display on the client > search view. > ''' </returns> > Function SelectForSearch() As ClientSearchKeyDocument > > ''' <summary> > ''' Clears the current search details. > ''' </summary> > Sub ClearSearch() > > ''' <summary> > ''' Performs a client search with the given client details. > ''' </summary> > ''' <param name="key">The client details to search for.</ > param> > ''' <remarks>Navigates to the search results view on success.</ > remarks> > Sub SearchForClient(ByVal key As ClientSearchKeyDocument) > > ''' <summary> > ''' Sets the index of the search result within the summary > document selected by > ''' the user and navigates to the view for that result. > ''' </summary> > ''' <param name="index">Index of the search result within the > summary document > ''' selected by the user.</param> > Sub SetSelectedSearchResult(ByVal index As Integer) > > ' search results > > ''' <summary> > ''' Gets or sets the currently selected page index for the > search results view. > ''' </summary> > ''' <value>The currently selected page index for the search > results view.</value> > Property SelectedPage() As Integer > > End Interface > > Public Interface IController(Of TKey As InteractionDocumentBase, > TEntity As InteractionDocumentBase, TSummary As > InteractionDocumentBase) > Inherits IControllerBase > > Property KeyDocument() As TKey > Property EntityDocument() As TEntity > Property SummaryDocument() As TSummary > > End Interface > > I can use Rhino Mocks to generate a mock of this with no problems > with > mockController = mocks.StrictMock(Of IClientSearchController)() > It doesn’t seem to matter whether I choose a StrictMock or a > DynamicMock. > > I notice when I step through the code in debug mode and add a Watch > for the mocked Controller, all the controller’s properties just show > as > <propertyName> - "previous method requires a return value or an > exception to throw". I can also set the expectation for the > Controller's SelectedPage property with no problems - it's setting it > for the SummaryDocument, the property hooked up via Generics, that's > causing the problem. > > What’s happening here, and how can I change my test to fix it? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Rhino.Mocks" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/RhinoMocks?hl=en -~----------~----~----~----~------~----~------~--~---
