using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using AutoMoq.Unity; using Microsoft.Practices.Unity; using Moq; using Moq.Language.Flow; namespace AutoMoq { public class AutoMoqer { private IUnityContainer container; private IDictionary registeredMocks; public AutoMoqer() { SetupAutoMoqer(new UnityContainer()); } internal AutoMoqer(IUnityContainer container) { SetupAutoMoqer(container); } public virtual T Resolve() { return container.Resolve(); } public virtual Mock GetMock() where T : class { var type = GetTheMockType(); if (GetMockHasNotBeenCalledForThisType(type)) CreateANewMockAndRegisterIt(type); return TheRegisteredMockForThisType(type); } public virtual void SetConstant(T instance) where T : class { container.RegisterInstance(instance); SetMock(instance.GetType(), null); } internal virtual void SetMock(Type type, Mock mock) { if (registeredMocks.ContainsKey(type) == false) registeredMocks.Add(type, mock); } #region private methods private void SetupAutoMoqer(IUnityContainer container) { this.container = container; registeredMocks = new Dictionary(); AddTheAutoMockingContainerExtensionToTheContainer(container); container.RegisterInstance(this); } private static void AddTheAutoMockingContainerExtensionToTheContainer(IUnityContainer container) { container.AddNewExtension(); return; } private Mock TheRegisteredMockForThisType(Type type) where T : class { return (Mock)registeredMocks.Where(x => x.Key == type).First().Value; } private void CreateANewMockAndRegisterIt(Type type) where T : class { var mock = new Mock(); container.RegisterInstance(mock.Object); SetMock(type, mock); } private bool GetMockHasNotBeenCalledForThisType(Type type) { return registeredMocks.ContainsKey(type) == false; } private static Type GetTheMockType() where T : class { return typeof(T); } #endregion public ISetup Setup(Expression> expression) where T : class { return GetMock().Setup(expression); } public ISetup Setup(Expression> expression) where T : class { return GetMock().Setup(expression); } public void Verify(Expression> expression) where T : class { GetMock().Verify(expression); } public void Verify(Expression> expression, string failMessage) where T : class { GetMock().Verify(expression, failMessage); } public void Verify(Expression> expression, Times times) where T : class { GetMock().Verify(expression, times); } public void Verify(Expression> expression, Times times, string failMessage) where T : class { GetMock().Verify(expression, times, failMessage); } } }