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 - --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
