public class MockRepositorySlim
{
private static readonly Dictionary<Kind, Func<MockRepository, Type, object[], Type[], object>> _mockMethods =
new Dictionary<Kind, Func<MockRepository, Type, object[], Type[], object>>(9)
{
{Kind.Relaxed,(r, t, cp, et) => et.Length > 0 ? r.DynamicMultiMock(t, et, cp) : r.DynamicMock(t, cp)},
{Kind.Strict, (r, t, cp, et) => et.Length > 0 ? r.CreateMultiMock(t, et, cp) : r.CreateMock(t, cp)},
{Kind.Stub, (r, t, cp, et) => r.Stub(t, cp)},
{Kind.Partial,(r, t, cp, et) => et.Length > 0 ? r.PartialMultiMock(t, et, cp) : r.PartialMock(t, cp)},
{Kind.Strict | Kind.WithRemoting, (r, t, cp, et) => r.CreateMockWithRemoting(t, cp)},
{Kind.Relaxed | Kind.WithRemoting, (r, t, cp, et) => r.DynamicMockWithRemoting(t, cp)}
};
private readonly MockRepository _repo = new MockRepository();
public TTypeToMock Mock<TTypeToMock>()
{
return Mock<TTypeToMock>(Kind.Relaxed, new Type[0], new object[0]);
}
public TTypeToMock Mock<TTypeToMock>(Kind mockKind)
{
return Mock<TTypeToMock>(mockKind, new Type[0], new object[0]);
}
public TTypeToMock Mock<TTypeToMock>(Kind mockKind, params object[] ctorArgs)
{
return Mock<TTypeToMock>(mockKind, new Type[0], ctorArgs);
}
public TTypeToMock Mock<TTypeToMock>(Kind mockKind, params Type[] extraTypes)
{
return Mock<TTypeToMock>(mockKind, extraTypes, new object[0]);
}
public TTypeToMock Mock<TTypeToMock>(Kind mockKind, Type[] extraTypes, params object[] ctorArgs)
{
if (extraTypes == null) throw new ArgumentNullException("extraTypes");
if (ctorArgs == null) throw new ArgumentNullException("ctorArgs");
if (mockKind == Kind.WithRemoting)
mockKind &= Kind.Strict;
else if (!_mockMethods.ContainsKey(mockKind))
{
if ((mockKind & Kind.WithRemoting) != 0)
throw new ArgumentException("This kind of mock does not support remoting.");
throw new ArgumentException("Invalid mock kind.", "mockKind");
}
//NOTE: possibly with lock in this call
var mock = (TTypeToMock) _mockMethods[mockKind](_repo, typeof (TTypeToMock), ctorArgs, extraTypes);
return mock;
}
}
internal static class KindExtensions
{
public static bool IsSet(this Kind kind, Kind value)
{
return (kind & value) == 0;
}
}
[Flags]
public enum Kind
{
Strict=0,
WithRemoting=1,
Relaxed=2,
Stub=4,
Partial=8
}