parent
69ba365cd3
commit
8bf4f81a04
@ -0,0 +1,166 @@
|
|||||||
|
// ReSharper disable RedundantUsingDirective
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using AutoMoq.Unity;
|
||||||
|
using Microsoft.Practices.Unity;
|
||||||
|
using Moq;
|
||||||
|
using Moq.Language.Flow;
|
||||||
|
|
||||||
|
[assembly: InternalsVisibleTo("AutoMoq.Tests")]
|
||||||
|
|
||||||
|
namespace AutoMoq
|
||||||
|
{
|
||||||
|
public class AutoMoqer
|
||||||
|
{
|
||||||
|
internal readonly MockBehavior DefaultBehavior = MockBehavior.Default;
|
||||||
|
internal Type ResolveType;
|
||||||
|
private IUnityContainer container;
|
||||||
|
private IDictionary<Type, object> registeredMocks;
|
||||||
|
|
||||||
|
public AutoMoqer()
|
||||||
|
{
|
||||||
|
SetupAutoMoqer(new UnityContainer());
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoMoqer(MockBehavior defaultBehavior)
|
||||||
|
{
|
||||||
|
DefaultBehavior = defaultBehavior;
|
||||||
|
SetupAutoMoqer(new UnityContainer());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
internal AutoMoqer(IUnityContainer container)
|
||||||
|
{
|
||||||
|
SetupAutoMoqer(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual T Resolve<T>()
|
||||||
|
{
|
||||||
|
ResolveType = typeof(T);
|
||||||
|
var result = container.Resolve<T>();
|
||||||
|
SetConstant(result);
|
||||||
|
ResolveType = null;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Mock<T> GetMock<T>() where T : class
|
||||||
|
{
|
||||||
|
return GetMock<T>(DefaultBehavior);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Mock<T> GetMock<T>(MockBehavior behavior) where T : class
|
||||||
|
{
|
||||||
|
ResolveType = null;
|
||||||
|
var type = GetTheMockType<T>();
|
||||||
|
if (GetMockHasNotBeenCalledForThisType(type))
|
||||||
|
{
|
||||||
|
CreateANewMockAndRegisterIt<T>(type, behavior);
|
||||||
|
}
|
||||||
|
|
||||||
|
var mock = TheRegisteredMockForThisType<T>(type);
|
||||||
|
|
||||||
|
if (behavior != MockBehavior.Default && mock.Behavior == MockBehavior.Default)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Unable to change be behaviour of a an existing mock.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return mock;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal virtual void SetMock(Type type, Mock mock)
|
||||||
|
{
|
||||||
|
if (registeredMocks.ContainsKey(type) == false)
|
||||||
|
registeredMocks.Add(type, mock);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void SetConstant<T>(T instance)
|
||||||
|
{
|
||||||
|
container.RegisterInstance(instance);
|
||||||
|
SetMock(instance.GetType(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISetup<T> Setup<T>(Expression<Action<T>> expression) where T : class
|
||||||
|
{
|
||||||
|
return GetMock<T>().Setup(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISetup<T, TResult> Setup<T, TResult>(Expression<Func<T, TResult>> expression) where T : class
|
||||||
|
{
|
||||||
|
return GetMock<T>().Setup(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().Verify(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression, string failMessage) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().Verify(expression, failMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression, Times times) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().Verify(expression, times);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression, Times times, string failMessage) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().Verify(expression, times, failMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void VerifyAllMocks()
|
||||||
|
{
|
||||||
|
foreach (var registeredMock in registeredMocks)
|
||||||
|
{
|
||||||
|
var mock = registeredMock.Value as Mock;
|
||||||
|
if (mock != null)
|
||||||
|
mock.VerifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region private methods
|
||||||
|
|
||||||
|
private void SetupAutoMoqer(IUnityContainer container)
|
||||||
|
{
|
||||||
|
this.container = container;
|
||||||
|
container.RegisterInstance(this);
|
||||||
|
|
||||||
|
registeredMocks = new Dictionary<Type, object>();
|
||||||
|
AddTheAutoMockingContainerExtensionToTheContainer(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddTheAutoMockingContainerExtensionToTheContainer(IUnityContainer container)
|
||||||
|
{
|
||||||
|
container.AddNewExtension<AutoMockingContainerExtension>();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Mock<T> TheRegisteredMockForThisType<T>(Type type) where T : class
|
||||||
|
{
|
||||||
|
return (Mock<T>)registeredMocks.Where(x => x.Key == type).First().Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateANewMockAndRegisterIt<T>(Type type, MockBehavior behavior) where T : class
|
||||||
|
{
|
||||||
|
var mock = new Mock<T>(behavior);
|
||||||
|
container.RegisterInstance(mock.Object);
|
||||||
|
SetMock(type, mock);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool GetMockHasNotBeenCalledForThisType(Type type)
|
||||||
|
{
|
||||||
|
return registeredMocks.ContainsKey(type) == false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Type GetTheMockType<T>() where T : class
|
||||||
|
{
|
||||||
|
return typeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
Copyright (c) 2010 Darren Cauthon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use,
|
||||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
@ -1,6 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="CommonServiceLocator" version="1.0" />
|
||||||
<package id="FluentAssertions" version="1.5.0.0" />
|
<package id="FluentAssertions" version="1.5.0.0" />
|
||||||
<package id="Moq" version="4.0.10827" />
|
<package id="Moq" version="4.0.10827" />
|
||||||
|
<package id="NBuilder" version="3.0.1" />
|
||||||
<package id="NUnit" version="2.5.10.11092" />
|
<package id="NUnit" version="2.5.10.11092" />
|
||||||
|
<package id="Unity" version="2.1.505.0" />
|
||||||
</packages>
|
</packages>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue