I feel so bad asking you guys for help, because you are all so thorough and I feel I'm just interrupting your work!
All help is much apprecciated, thanks. On Sep 10, 8:50 am, Alex McMahon <[email protected]> wrote: > Glad you managed to make some headway. If you have any further > problems let us know > > 2009/9/9 bill richards <[email protected]>: > > > > > > > A quick design review has found the slightly "skewed" implementation > > detail and a modification has been made and now we have eliminated the > > need to pass around the unity container. > > > On Sep 9, 4:57 pm, Alex McMahon <[email protected]> wrote: > >> A few observations: > >> 1. The usage pattern for Unity seems a bit odd. I wouldn't expect to > >> see any references to unity in the majority of an application's > >> classes. One of the main points about IoC such as Unity is that it > >> automatically resolves dependencies so if you changed your > >> StatusBarModule constructor to take and IRegionManager and an > >> IEventAggregator then when unity tries to build your StatusBarModule > >> it will automatically populate those construction parameters. > >> 2. Similarly with the call to Resolve<IStatusBarViewPresenter> this > >> could/should be replaced with a dependency that is populated by unity > >> (probably in the constructor). > >> 3. Once you replace the constructor parameters your test can get rid > >> of the MockUnityContainer and just create MockRegionManager (and other > >> dependencies), pass it in explicitly in the constructor (Note that > >> during the test Unity will not be used at all) Then in the actual test > >> you can just write > >> regionManager.AssertWasCalled(x=>x.RegisterViewWithRegion(....) > > >> I must admit my knowledge of Prism and Unity is patchy, but with CAB > >> (the precursor to Prism) this was how we worked. > > >> Try only having one place in your application aware of Unity, and let > >> all the dependencies of your object graph be populated by unity. This > >> will leave your application much less tightly bound to Unity. > > >> 2009/9/9 bill richards <[email protected]>: > > >> > Alex, > > >> > thanks for that, and the point is conceeded: > > >> > The code as posted represents the "Arrange" aspect of the AAA test, > >> > and the remainder was not posted, because at the time of posting, it > >> > seemed superfluous to the issue I am trying to resolve. > > >> > I also agree that there are quite a number of items being stubbed, but > >> > this is due to the complexity of the framework (Prism V2). > > >> > This is class definition for the object under test: > > >> > public class StatusBarModule > >> > { > >> > public StatusBarModule(IUnityContainer container) > >> > { > >> > Container = container; > >> > RegionManager = Container.Resolve<IRegionManager>(); > >> > TheEventAggregator = Container.Resolve<IEventAggregator> > >> > (); > >> > } > > >> > public IUnityContainer Container { get; private set; } > >> > public IRegionManager RegionManager { get; private set; } > >> > protected IEventAggregator TheEventAggregator { get; private > >> > set; } > > >> > public void > >> > RegisterViewsAndServicesNotLoadedThroughConfiguration() { } > > >> > public void RaiseAnyPertinentEventsEtc() { } > > >> > public string ConfigurationContainerName { get { return > >> > "Status"; } } > > >> > public void Initialize() > >> > { > >> > var section = (UnityConfigurationSection) > >> > ConfigurationManager.GetSection("Unity"); > >> > if (section != null && section.Containers > >> > [ConfigurationContainerName] != null) > >> > section.Containers > >> > [ConfigurationContainerName].Configure(Container); > > >> > RegisterViewsAndServicesNotLoadedThroughConfiguration(); > >> > RegisterViewsWithRegions(); > >> > RaiseAnyPertinentEventsEtc(); > >> > } > > >> > public void RegisterViewsWithRegions() > >> > { > >> > RegionManager.RegisterViewWithRegion > >> > (RegionNames.StatusBarRegion, () => > >> > Container.Resolve<IStatusBarViewPresenter>().View); > >> > } > > >> > } > > >> > And this is the full test: > > >> > [Test] > >> > public void > >> > WhenInstantiated_ShouldRegisterIStatusBarViewWithRegionManager() > >> > { > >> > var unity = MockRepository.GenerateStub<IUnityContainer> > >> > (); > >> > var presenter = > >> > MockRepository.GenerateStub<IStatusBarViewPresenter>(); > >> > var view = MockRepository.GenerateStub<IStatusBarView>(); > >> > presenter.View = view; > > >> > var eventAggregator = > >> > MockRepository.GenerateStub<IEventAggregator>(); > >> > var regionManager = > >> > MockRepository.GenerateStub<IRegionManager>(); > >> > var region = MockRepository.GenerateStub<IRegion>(); > >> > var regionCollection = > >> > MockRepository.GenerateMock<IRegionCollection>(); > >> > regionCollection.Add(RegionNames.StatusBarRegion, region); > > >> > regionManager.Stub(r => r.Regions).Return > >> > (regionCollection); > > >> > unity.Stub(container => container.Resolve<IEventAggregator> > >> > ()).Return(eventAggregator); > >> > unity.Stub(container => container.Resolve<IRegionManager> > >> > ()).Return(regionManager); > >> > unity.Stub(container => > >> > container.Resolve<IStatusBarViewPresenter>()).Return(presenter); > > >> > new StatusBarModule(unity).Initialize(); // > >> > RegionManager.Regions doesn't contain any regions!! > > >> > unity.AssertWasCalled(container => > >> > container.Resolve<IEventAggregator>()); > >> > unity.AssertWasCalled(container => > >> > container.Resolve<IRegionManager>()); > >> > unity.AssertWasCalled(container => > >> > container.Resolve<IStatusBarViewPresenter>()); > >> > regionManager.AssertWasCalled(manager => > >> > manager.RegisterViewWithRegion(RegionNames.StatusBarRegion, () => > >> > presenter.View)); > >> > } > > >> > As you can see, the actual line fo code that I am testing is > > >> > RegionManager.RegisterViewWithRegion > >> > (RegionNames.StatusBarRegion, () => > >> > Container.Resolve<IStatusBarViewPresenter>().View); > > >> > Though now having described the whole scenario, I'm thinking that > >> > really, what I am testing is whether or not the > >> > "RegisterViewsWithRegions()" member is called; however without > >> > stubbing the other required operands I cannot see how I would go about > >> > defining that test.- Hide quoted text - > > >> - Show quoted text -- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
