public
Description: Extremely simplistic mocking library to help those new to TDD not have to focus on their mocking library.
Homepage:
Clone URL: git://github.com/jcbozonier/CrutchMocks.git
CrutchMocks / MiniMock / MiniMock / Mocking / Mockery.cs
100644 106 lines (90 sloc) 3.755 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
 
namespace MiniMock.Mocking
{
    public class Mockery
    {
        public static T Mock<T>()
        {
            var assemblyName = new AssemblyName();
            assemblyName.Name = "mockedAssembly";
            var assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
            var moduleBuilder = assemblyBuilder.DefineDynamicModule("tmpModule");
 
            var typeBuilder = moduleBuilder.DefineType("MockedFoo",
                                                       TypeAttributes.Public | TypeAttributes.Class,
                                                       null,
                                                       new[] { typeof(T) });
 
            var mockType = typeof (T);
            var methods = mockType.GetMethods();
 
            if (methods.Count() > 0)
            {
                foreach (var methodInfo in methods)
                {
                    var firstMethodName = methodInfo.Name;
                    Type[] parameterTypes = null;
 
                    if(_MethodHasParameters(methodInfo))
                    {
                        parameterTypes = _GetParamterTypes(methodInfo);
                    }
 
                    if (_MethodReturnsValue(methodInfo))
                    {
                        _GenerateMethod_With_Return(methodInfo, typeBuilder, firstMethodName, parameterTypes);
                    }
                    else
                    {
                        _GenerateMethod_Without_Return(typeBuilder, firstMethodName, parameterTypes);
                    }
                }
            }
 
            var mockedType = typeBuilder.CreateType();
            var mockedObject = Activator.CreateInstance(mockedType);
 
            return (T) mockedObject;
        }
 
        private static Type[] _GetParamterTypes(MethodInfo methodInfo)
        {
            var parameterList = methodInfo.GetParameters();
            if (parameterList == null)
                return null;
            
            var result = parameterList.Select(x => x.ParameterType).ToArray();
            return result;
        }
 
        private static bool _MethodHasParameters(MethodInfo methodInfo)
        {
            return methodInfo.GetParameters().Count() > 0;
        }
 
        private static void _GenerateMethod_Without_Return(TypeBuilder typeBuilder, string firstMethodName, Type[] parameterTypes)
        {
            var methodBuilder = typeBuilder.DefineMethod(
                    firstMethodName,
                    MethodAttributes.Public | MethodAttributes.Virtual,
                    typeof (void),
                    parameterTypes);
            var methodIl = methodBuilder.GetILGenerator();
 
            methodIl.Emit(OpCodes.Ret);
        }
 
        private static void _GenerateMethod_With_Return(
            MethodInfo methodInfo,
            TypeBuilder typeBuilder,
            string firstMethodName,
            Type[] parameterTypes)
        {
            var returnType = methodInfo.ReturnType;
            var methodBuilder = typeBuilder.DefineMethod(
                    firstMethodName,
                    MethodAttributes.Public | MethodAttributes.Virtual,
                    returnType,
                    parameterTypes);
            var methodIl = methodBuilder.GetILGenerator();
 
            methodIl.DeclareLocal(returnType);
            methodIl.Emit(OpCodes.Ldloc_0);
            methodIl.Emit(OpCodes.Ret);
        }
 
        private static bool _MethodReturnsValue(MethodInfo methodInfo)
        {
            return methodInfo.ReturnType != typeof(void);
        }
    }
}