This line: ControllerBase mockController = mocks.DynamicMock<IMyController>();
doesn't make any sense. There's no relation between ControllerBase and IMyController the InvalidCastException is spot-on. Tim On Wed, Jan 27, 2010 at 7:00 PM, TheMightyKumquat <[email protected]>wrote: > How can you mock an object that both implements an interface and > inherits from a base class, when the method you're testing uses both? > > I'm testing a class that has an object in it that inherits from an > abstract base class and also inherits from an interface - in the > example code below, it's the MyPresenter.OnLoad method. The method > sets event handlers for two events, one defined in the abstract base > class and one that's defined in the interface. > > My test mocks the controller as DynamicMock<IMyController>. This lets > me set up expectations for an event handler to the event defined in > the interface - but my test fails on the event handler getting wired > up for the abstract class event. The mocked object throws an exception > when cast as a ControllerBase object. > > System.InvalidCastException: Unable to cast object of type > 'Castle.Proxies.IMyControllerProxyf09d4fa4a658425992d11645397d8e3f' to > type 'ControllerBase'.. > > Example code for this is below. I'd really appreciate any advice. > > [TestMethod()] > public void OnViewLoaded_Test() > { > // Arrange > MyPresenter testPresenter = new MyPresenter(); > ControllerBase mockController = mocks.DynamicMock<IMyController>(); > > // set up expectation that during the test, the class > being tested will add > // a handler to the Controller's events and that this event > handler will not be null > mockController.TaskSuspending += null; > LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull()); > ((ControllerBase))mockController.TaskSuspending += null; > LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull()); > mocks.ReplayAll(); > > // Act > testPresenter.OnViewLoaded(); > > // Assert > mocks.VerifyAll(); > } > > > public abstract class ControllerBase > { > /// <summary> > /// Event raised when a task is being started. > /// </summary> > public event EventHandler StartTask; > } > > public interface IMyController > { > event EventHandler ChangingTabs; > } > > public class MyController : ControllerBase, IMyController > { > public event EventHandler ChangingTabs; > > protected virtual void OnChangingTabsChanged(EventArgs e) > { > if (ChangingTabs != null) > { > ChangingTabs(this, e); > } > } > > } > > public class MyPresenter > { > private MyController controller; > > public MyPresenter() > { > controller = new MyController(); > } > > public void OnLoad() > { > controller.ChangingTabs += this.HandleChangingTabs; > ((ControllerBase)controller).StartTask += > this.HandleStartTask; > } > > public void HandleChangingTabs(object sender, EventArgs e) > { > // do something > } > > public void HandleStartTask(object sender, EventArgs e) > { > // do something > } > > } > > -- > 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]<rhinomocks%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/rhinomocks?hl=en. > > -- Tim Barcz Microsoft C# MVP Microsoft ASPInsider http://timbarcz.devlicio.us http://www.twitter.com/timbarcz -- 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.
