Best JustMockLite code snippet using Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode.GetMethodMock
MocksRepository.cs
Source:MocksRepository.cs  
...739        internal void AssertAll(string message, object mock)740        {741            using (MockingContext.BeginFailureAggregation(message))742            {743                var mocks = GetMethodMocksFromObject(mock);744                AssertBehaviorsForMocks(mocks.Select(m => m.MethodMock), false);745            }746        }747        internal void AssertAll(string message)748        {749            using (MockingContext.BeginFailureAggregation(message))750            {751                var mocks = GetAllMethodMocks();752                AssertBehaviorsForMocks(mocks.Select(m => m.MethodMock), false);753            }754        }755        internal void Assert(string message, object mock, Expression expr = null, Args args = null, Occurs occurs = null)756        {757            using (MockingContext.BeginFailureAggregation(message))758            {759                if (expr == null)760                {761                    List<IMethodMock> mocks = new List<IMethodMock>();762                    mocks.AddRange(GetMethodMocksFromObject(mock).Select(m => m.MethodMock));763                    foreach (var methodMock in mocks)764                    {765                        foreach (var behavior in methodMock.Behaviors.OfType<IAssertableBehavior>())766                            behavior.Assert();767                    }768                    MockingUtil.UnwrapDelegateTarget(ref mock);769                    var mockMixin = GetMockMixin(mock, null);770                    if (mockMixin != null)771                    {772                        foreach (var behavior in mockMixin.FallbackBehaviors.OfType<IAssertableBehavior>()773                            .Concat(mockMixin.SupplementaryBehaviors.OfType<IAssertableBehavior>()))774                            behavior.Assert();775                    }776                }777                else778                {779                    CallPattern callPattern = CallPatternCreator.FromExpression(this, expr);780                    AssertForCallPattern(callPattern, args, occurs);781                }782            }783        }784        internal void AssertAction(string message, Action memberAction, Args args = null, Occurs occurs = null)785        {786            using (MockingContext.BeginFailureAggregation(message))787            {788                CallPattern callPattern = CallPatternCreator.FromAction(this, memberAction);789                AssertForCallPattern(callPattern, args, occurs);790            }791        }792        internal void AssertSetAction(string message, Action memberAction, Args args = null, Occurs occurs = null)793        {794            using (MockingContext.BeginFailureAggregation(message))795            {796                using (this.sharedContext.StartAssertSet())797                {798                    CallPattern callPattern = CallPatternCreator.FromAction(this, memberAction, true);799                    AssertForCallPattern(callPattern, args, occurs);800                }801            }802        }803        internal void AssertMethodInfo(string message, object instance, MethodBase method, object[] arguments, Occurs occurs)804        {805            using (MockingContext.BeginFailureAggregation(message))806            {807                CallPattern callPattern = CallPatternCreator.FromMethodBase(instance, method, arguments);808                AssertForCallPattern(callPattern, null, occurs);809            }810        }811        internal void AssertIgnoreInstance(string message, Type type, bool ignoreMethodMockOccurrences)812        {813            using (MockingContext.BeginFailureAggregation(message))814            {815                var methodMocks = GetMethodMocksFromObject(null, type);816                AssertBehaviorsForMocks(methodMocks.Select(m => m.MethodMock), ignoreMethodMockOccurrences);817            }818        }819        internal int GetTimesCalled(Expression expression, Args args)820        {821            CallPattern callPattern = CallPatternCreator.FromExpression(this, expression);822            int callsCount;823            CountMethodMockInvocations(callPattern, args, out callsCount);824            return callsCount;825        }826        internal int GetTimesCalledFromAction(Action action, Args args)827        {828            var callPattern = CallPatternCreator.FromAction(this, action);829            int callsCount;830            CountMethodMockInvocations(callPattern, args, out callsCount);831            return callsCount;832        }833        internal int GetTimesCalledFromMethodInfo(object instance, MethodBase method, object[] arguments)834        {835            var callPattern = CallPatternCreator.FromMethodBase(instance, method, arguments);836            int callsCount;837            CountMethodMockInvocations(callPattern, null, out callsCount);838            return callsCount;839        }840        private HashSet<IMethodMock> CountMethodMockInvocations(CallPattern callPattern, Args args, out int callsCount)841        {842            if (callPattern.IsDerivedFromObjectEquals)843                throw new MockException("Cannot assert calls to methods derived from Object.Equals");844            PreserveRefOutValuesBehavior.ReplaceRefOutArgsWithAnyMatcher(callPattern);845            if (args != null)846            {847                if (args.Filter != null)848                {849                    if (args.IsIgnored == null)850                    {851                        args.IsIgnored = true;852                    }853                    if (!callPattern.Method.IsStatic854                        && args.IsInstanceIgnored == null855                        && args.Filter.Method.GetParameters().Length == callPattern.Method.GetParameters().Length + 1)856                    {857                        args.IsInstanceIgnored = true;858                    }859                }860                if (args.IsIgnored == true)861                {862                    for (int i = 0; i < callPattern.ArgumentMatchers.Count; i++)863                        callPattern.ArgumentMatchers[i] = new AnyMatcher();864                }865                if (args.IsInstanceIgnored == true)866                {867                    callPattern.InstanceMatcher = new AnyMatcher();868                }869                callPattern.Filter = args.Filter;870            }871            MethodInfoMatcherTreeNode root;872            callsCount = 0;873            var mocks = new HashSet<IMethodMock>();874            var method = callPattern.Method;875            if (invocationTreeRoots.TryGetValue(method, out root))876            {877                var occurences = root.GetOccurences(callPattern);878                callsCount = occurences.Select(x => x.Calls).Sum();879                foreach (var mock in occurences.SelectMany(x => x.Mocks))880                {881                    mocks.Add(mock);882                }883            }884            return mocks;885        }886        private void AssertForCallPattern(CallPattern callPattern, Args args, Occurs occurs)887        {888            int callsCount;889            var mocks = CountMethodMockInvocations(callPattern, args, out callsCount);890            if (occurs != null)891            {892                InvocationOccurrenceBehavior.Assert(occurs.LowerBound, occurs.UpperBound, callsCount, null, null);893            }894            if (mocks.Count == 0)895            {896                MethodInfoMatcherTreeNode funcRoot;897                if (arrangementTreeRoots.TryGetValue(callPattern.Method, out funcRoot))898                {899                    var arranges = funcRoot.GetAllMethodMocks(callPattern);900                    foreach (var arrange in arranges)901                    {902                        mocks.Add(arrange.MethodMock);903                    }904                }905            }906            if (occurs == null && mocks.Count == 0)907            {908                InvocationOccurrenceBehavior.Assert(Occurs.AtLeastOnce().LowerBound, Occurs.AtLeastOnce().UpperBound, callsCount, null, null);909            }910            else911            {912                AssertBehaviorsForMocks(mocks, occurs != null);913            }914        }915        internal MethodBase GetMethodFromCallPattern(CallPattern callPattern)916        {917            var method = callPattern.Method as MethodInfo;918            if (method == null || !method.IsVirtual)919                return callPattern.Method;920            method = method.NormalizeComInterfaceMethod();921            var valueMatcher = callPattern.InstanceMatcher as IValueMatcher;922            if (valueMatcher != null && valueMatcher.Value != null)923            {924                var valueType = valueMatcher.Value.GetType();925                var mockMixin = GetMockMixin(valueMatcher.Value, null);926                var type = mockMixin != null ? mockMixin.DeclaringType : valueType;927                if (!type.IsInterface && method.DeclaringType.IsAssignableFrom(type))928                {929                    var concreteMethod = MockingUtil.GetConcreteImplementer(method, type);930                    if (!concreteMethod.IsInheritable() && !ProfilerInterceptor.IsProfilerAttached)931                    {932                        var reimplementedInterfaceMethod = (MethodInfo)method.GetInheritanceChain().Last();933                        if (reimplementedInterfaceMethod.DeclaringType.IsInterface934                            && mockFactory.IsAccessible(reimplementedInterfaceMethod.DeclaringType))935                        {936                            concreteMethod = reimplementedInterfaceMethod;937                        }938                    }939                    method = concreteMethod;940                }941            }942            if (method.DeclaringType != method.ReflectedType)943                method = (MethodInfo)MethodBase.GetMethodFromHandle(method.MethodHandle, method.DeclaringType.TypeHandle);944            return method;945        }946        /// <summary>947        /// Converts the given object to a matcher as follows. This method is most useful for948        /// creating a matcher out of an argument expression.949        /// 950        /// It works as follows:951        /// If the object is not an expression, then a value matcher for that object is returned.952        /// If the object is an expression then:953        /// * if the top of the expression is a method call expression and the member954        ///     has the ArgMatcherAttribute then the specific matcher type is instantiaded955        ///     with the parameters passed to the method call expression and returned.956        ///     If the matcher type is generic, then it is defined with the type of the expression.957        /// * if the top expression is a member or method call and the member958        ///     has the ArgIgnoreAttribute, then a TypeMatcher is returned959        /// * otherwise, the expression is evaluated and a ValueMatcher is returned960        /// </summary>961        /// <param name="argumentObj"></param>962        /// <returns></returns>963        internal static IMatcher CreateMatcherForArgument(object argumentObj)964        {965            var argExpr = argumentObj as Expression;966            if (argExpr == null)967            {968                return new ValueMatcher(argumentObj);969            }970            else971            {972                var argMatcher = TryCreateMatcherFromArgMember(argExpr);973                if (argMatcher != null)974                {975                    return argMatcher;976                }977                else978                {979                    //no matcher, evaluate the original expression980                    var argValue = argExpr.EvaluateExpression();981                    return new ValueMatcher(argValue);982                }983            }984        }985        internal static IMatcher TryCreateMatcherFromArgMember(Expression argExpr)986        {987            // The expression may end with a conversion which erases the type of the required matcher.988            // Remove the conversion before working with matchers989            while (argExpr.NodeType == ExpressionType.Convert)990                argExpr = ((UnaryExpression)argExpr).Operand;991            ArgMatcherAttribute argAttribute = null;992            Expression[] matcherArguments = null;993            if (argExpr is MethodCallExpression)994            {995                var methodCall = (MethodCallExpression)argExpr;996                argAttribute = (ArgMatcherAttribute)Attribute.GetCustomAttribute(methodCall.Method, typeof(ArgMatcherAttribute));997                matcherArguments = methodCall.Arguments.ToArray();998            }999            else if (argExpr is MemberExpression)1000            {1001                var memberExpr = (MemberExpression)argExpr;1002                argAttribute = (ArgMatcherAttribute)Attribute.GetCustomAttribute(memberExpr.Member, typeof(ArgMatcherAttribute));1003            }1004            if (argAttribute != null)1005            {1006                if (argAttribute.GetType() == typeof(ArgIgnoreAttribute))1007                {1008                    return new TypeMatcher(argExpr.Type);1009                }1010                else if (argAttribute.GetType() == typeof(ArgIgnoreTypeAttribute))1011                {1012                    var func = Expression.Lambda(argExpr).Compile();1013                    var funcResult = func.DynamicInvoke();1014                    return new TypeMatcher(funcResult.GetType());1015                }1016                else if (argAttribute.GetType() == typeof(RefArgAttribute) || argAttribute.GetType() == typeof(OutArgAttribute))1017                {1018                    var asMemberExpr = argExpr as MemberExpression;1019                    if (asMemberExpr != null)1020                    {1021                        argExpr = asMemberExpr.Expression;1022                    }1023                    var refCall = (MethodCallExpression)argExpr;1024                    var actualArg = refCall.Arguments[0];1025                    var memberExpr = actualArg as MemberExpression;1026                    if (memberExpr != null && typeof(Expression).IsAssignableFrom(memberExpr.Type) && memberExpr.Expression.Type.DeclaringType == typeof(ArgExpr))1027                    {1028                        actualArg = (Expression)actualArg.EvaluateExpression();1029                    }1030                    var argMatcher = CreateMatcherForArgument(actualArg);1031                    argMatcher.ProtectRefOut = argAttribute.GetType() == typeof(RefArgAttribute);1032                    return argMatcher;1033                }1034                else1035                {1036                    var matcherType = argAttribute.Matcher;1037                    var matcherArgs = argAttribute.MatcherArgs;1038                    if (matcherType.IsGenericTypeDefinition)1039                        matcherType = matcherType.MakeGenericType(argExpr.Type);1040                    if (matcherArgs == null && matcherArguments != null)1041                        matcherArgs = matcherArguments.Select(matcherArgExpr => matcherArgExpr.EvaluateExpression()).ToArray();1042                    var matcher = (IMatcher)MockingUtil.CreateInstance(matcherType, matcherArgs);1043                    return matcher;1044                }1045            }1046            else1047            {1048                return null;1049            }1050        }1051        private void AddArrange(IMethodMock methodMock)1052        {1053            var method = methodMock.CallPattern.Method;1054            if (methodMock.CallPattern.IsDerivedFromObjectEquals && method.ReflectedType.IsValueType())1055                throw new MockException("Cannot mock Equals method because JustMock depends on it. Also, when Equals is called internally by JustMock, all methods called by it will not be intercepted and will have only their original implementations called.");1056            CheckMethodInterceptorAvailable(methodMock.CallPattern.InstanceMatcher, method);1057            Type declaringType = method.DeclaringType;1058            // If we're arranging a call to a mock object, overwrite its repository.1059            // This will ensure correct behavior when a mock object is arranged1060            // in multiple contexts.1061            var refMatcher = methodMock.CallPattern.InstanceMatcher as ReferenceMatcher;1062            if (refMatcher != null)1063            {1064                var value = refMatcher.Value;1065                var mock = GetMockMixin(value, declaringType);1066                if (mock != null)1067                {1068                    methodMock.Mock = mock;1069                    mock.Repository = this;1070                }1071                if (value != null)1072                    EnableInterception(value.GetType());1073            }1074            EnableInterception(declaringType);1075            PreserveRefOutValuesBehavior.Attach(methodMock);1076            ConstructorMockBehavior.Attach(methodMock);1077            MethodInfoMatcherTreeNode funcRoot;1078            if (!arrangementTreeRoots.TryGetValue(method, out funcRoot))1079            {1080                funcRoot = new MethodInfoMatcherTreeNode(method);1081                arrangementTreeRoots.Add(method, funcRoot);1082            }1083            funcRoot.AddChild(methodMock.CallPattern, methodMock, this.sharedContext.GetNextArrangeId());1084#if !PORTABLE1085            if (ProfilerInterceptor.IsReJitEnabled)1086            {1087                CallPattern.CheckMethodCompatibility(method);1088                CallPattern.CheckInstrumentationAvailability(method);1089                ProfilerInterceptor.RequestReJit(method);1090            }1091            try1092            {1093                if (MockingContext.Plugins.Exists<IDebugWindowPlugin>())1094                {1095                    var debugWindowPlugin = MockingContext.Plugins.Get<IDebugWindowPlugin>();1096                    var argumentMatchers =1097                        methodMock.CallPattern.ArgumentMatchers1098                            .SelectMany(1099                                (IMatcher matcher, int index) =>1100                                    {1101                                        MatcherInfo[] paramsMatchers;1102                                        var matcherInfo = MatcherInfo.FromMatcherAndParamInfo(matcher, methodMock.CallPattern.Method.GetParameters()[index], out paramsMatchers);1103                                        if (matcherInfo.Kind == MatcherInfo.MatcherKind.Params && paramsMatchers.Length > 0)1104                                        {1105                                            // skip params matcher, but add all contained matchers1106                                            return paramsMatchers;1107                                        }1108                                        return new MatcherInfo[] { matcherInfo };1109                                    },1110                                (IMatcher matcher, MatcherInfo resultMatcherInfo) => resultMatcherInfo)1111                            .ToArray();1112                    debugWindowPlugin.MockCreated(1113                        methodMock.Repository.RepositoryId,1114                        methodMock.Repository.GetRepositoryPath(),1115                        MockInfo.FromMethodBase(methodMock.CallPattern.Method),1116                        argumentMatchers);1117                }1118            }1119            catch (Exception e)1120            {1121                System.Diagnostics.Trace.WriteLine("Exception thrown calling IDebugWindowPlugin plugin: " + e);1122            }1123#endif1124        }1125#if !PORTABLE1126        internal void UpdateMockDebugView(MethodBase method, IMatcher[] argumentMatchers)1127        {1128            try1129            {1130                if (MockingContext.Plugins.Exists<IDebugWindowPlugin>())1131                {1132                    var debugWindowPlugin = MockingContext.Plugins.Get<IDebugWindowPlugin>();1133                    MatcherInfo[] argumentMatcherInfos = null;1134                    if (argumentMatchers != null)1135                    {1136                        argumentMatcherInfos =1137                            argumentMatchers.Select(1138                                (IMatcher matcher, int index) =>1139                                    {1140                                        MatcherInfo[] dummy;1141                                        return MatcherInfo.FromMatcherAndParamInfo(matcher, method.GetParameters()[index], out dummy);1142                                    })1143                            .ToArray();1144                    }1145                    debugWindowPlugin.MockUpdated(1146                        this.RepositoryId,1147                        this.GetRepositoryPath(),1148                        MockInfo.FromMethodBase(method),1149                        argumentMatcherInfos);1150                }1151            }1152            catch (Exception e)1153            {1154                System.Diagnostics.Trace.WriteLine("Exception thrown calling IDebugWindowPlugin plugin: " + e);1155            }1156        }1157#endif1158        private void CheckMethodInterceptorAvailable(IMatcher instanceMatcher, MethodBase method)1159        {1160            if (ProfilerInterceptor.IsProfilerAttached)1161                return;1162            var valueMatcher = instanceMatcher as IValueMatcher;1163            if (valueMatcher == null)1164                return;1165            var instance = valueMatcher.Value;1166            if (instance == null)1167                return;1168            if (MockingProxy.CanIntercept(instance, method))1169                return;1170            if (!(instance is IMockMixin) || !method.IsInheritable())1171                ProfilerInterceptor.ThrowElevatedMockingException(method);1172        }1173#if !PORTABLE1174        private void RequestRejitForTypeMethods(Type typeToIntercept)1175        {1176            var methods = new HashSet<MethodBase>();1177            methods.UnionWith(typeToIntercept.GetMethods(MockingUtil.AllMembers));1178            methods.UnionWith(1179                typeToIntercept.GetInheritanceChain()1180                    .Where(type => type != typeToIntercept)1181                    .SelectMany(type => type.GetMethods(MockingUtil.AllMembers | BindingFlags.DeclaredOnly))1182                    .Where(method => !method.IsAbstract && method.DeclaringType != typeof(object)));1183            methods.UnionWith(1184                MockingUtil.GetAllProperties(typeToIntercept)1185                    .SelectMany(1186                        property =>1187                            {1188                                var propertyMethods = new List<MethodBase>();1189                                var getMethod = property.GetMethod;1190                                if (getMethod != null)1191                                {1192                                    propertyMethods.Add(getMethod);1193                                }1194                                var setMethod = property.SetMethod;1195                                if (setMethod != null)1196                                {1197                                    propertyMethods.Add(setMethod);1198                                }1199                                return propertyMethods;1200                            }));1201            foreach (var method in methods)1202            {1203                try1204                {1205                    CallPattern.CheckMethodCompatibility(method);1206                    CallPattern.CheckInstrumentationAvailability(method);1207                    ProfilerInterceptor.RequestReJit(method);1208                }1209                catch (MockException e)1210                {1211#if DEBUG1212                    System.Diagnostics.Trace.WriteLine(string.Format("Method {0} is skipped for interception: {1}", method, e));1213#endif1214                }1215            }1216        }1217#endif1218        internal void EnableInterception(Type typeToIntercept)1219        {1220            if (ProfilerInterceptor.IsProfilerAttached)1221            {1222                for (var type = typeToIntercept; type != null;)1223                {1224                    if (!ProfilerInterceptor.TypeSupportsInstrumentation(type))1225                        DebugView.TraceEvent(IndentLevel.Warning, () => String.Format("Elevated mocking for type {0} will not be available due to limitations in CLR", type));1226                    if (this.arrangedTypes.Add(type))1227                    {1228                        ProfilerInterceptor.EnableInterception(type, true, this);1229#if !PORTABLE1230                        if (ProfilerInterceptor.IsReJitEnabled && type == typeToIntercept)1231                        {1232                            RequestRejitForTypeMethods(type);1233                        }1234#endif1235                    }1236                    type = type.BaseType;1237                    if (type == typeof(object) || type == typeof(ValueType) || type == typeof(Enum))1238                        break;1239                }1240                using (this.sharedContext.StartRunClassConstructor())1241                {1242                    var handle = typeToIntercept.TypeHandle;1243                    this.disabledTypes.Add(typeof(RuntimeHelpers));1244                    ProfilerInterceptor.RunClassConstructor(handle);1245                    this.disabledTypes.Remove(typeof(RuntimeHelpers));1246                }1247            }1248        }1249        internal void DisableInterception(Type typeToIntercept)1250        {1251            if (ProfilerInterceptor.IsProfilerAttached)1252            {1253                if (this.arrangedTypes.Remove(typeToIntercept))1254                {1255                    ProfilerInterceptor.EnableInterception(typeToIntercept, false, this);1256                }1257                this.disabledTypes.Add(typeToIntercept);1258            }1259        }1260        private List<MethodMockMatcherTreeNode> GetMethodMocksFromObject(object mock, Type mockType = null)1261        {1262            MockingUtil.UnwrapDelegateTarget(ref mock);1263            var methodMocks = new List<MethodMockMatcherTreeNode>();1264            var visitedMocks = new List<object>(); // can't be HashSet because we can't depend on GetHashCode being implemented properly1265            GetMethodMocksFromObjectInternal(mock, mockType, methodMocks, visitedMocks);1266            return methodMocks;1267        }1268        private void GetMethodMocksFromObjectInternal(object mock, Type mockType, List<MethodMockMatcherTreeNode> methodMocks, List<object> visitedMocks)1269        {1270            if (visitedMocks.Contains(mock))1271                return;1272            visitedMocks.Add(mock);1273            IMatcher instanceMatcher;1274            Func<MethodInfoMatcherTreeNode, bool> rootMatcher;1275            if (mockType != null)1276            {1277                instanceMatcher = new AnyMatcher();1278                rootMatcher = node => mockType.IsAssignableFrom(node.MethodInfo.DeclaringType);1279            }1280            else1281            {1282                instanceMatcher = new ValueMatcher(mock);1283                rootMatcher = node =>1284                {1285                    foreach (var child in node.Children)1286                    {1287                        if (child.Matcher.Matches(instanceMatcher))1288                        {1289                            return true;1290                        }1291                    }1292                    return false;1293                };1294            }1295            foreach (var funcRoot in arrangementTreeRoots.Values.Where(rootMatcher))1296            {1297                var callPattern = CallPattern.CreateUniversalCallPattern(funcRoot.MethodInfo);1298                callPattern.InstanceMatcher = instanceMatcher;1299                var results = funcRoot.GetAllMethodMocks(callPattern);1300                methodMocks.AddRange(results);1301            }1302            if (mock != null)1303            {1304                var mockMixin = GetMockMixin(mock, null);1305                if (mockMixin != null)1306                {1307                    foreach (var dependentMock in mockMixin.DependentMocks)1308                        GetMethodMocksFromObjectInternal(dependentMock, null, methodMocks, visitedMocks);1309                }1310            }1311        }1312        private List<MethodMockMatcherTreeNode> GetAllMethodMocks()1313        {1314            var methodMocks = new List<MethodMockMatcherTreeNode>();1315            GetAllMethodMocksInternal(methodMocks);1316            return methodMocks;1317        }1318        private void GetAllMethodMocksInternal(List<MethodMockMatcherTreeNode> methodMocks)1319        {1320            foreach (var funcRoot in arrangementTreeRoots.Values)1321            {1322                var callPattern = CallPattern.CreateUniversalCallPattern(funcRoot.MethodInfo);1323                var results = funcRoot.GetAllMethodMocks(callPattern);1324                methodMocks.AddRange(results);1325            }1326        }1327        private bool DispatchInvocationToMethodMocks(Invocation invocation)1328        {1329            CallPattern callPattern = CallPatternCreator.FromInvocation(invocation);1330            MethodInfoMatcherTreeNode funcRoot = null;1331            if (!invocation.InArrange && !invocation.InAssertSet)1332            {1333                if (!invocationTreeRoots.TryGetValue(callPattern.Method, out funcRoot))1334                {1335                    funcRoot = new MethodInfoMatcherTreeNode(callPattern.Method);1336                    invocationTreeRoots.Add(callPattern.Method, funcRoot);1337                }1338            }1339            var methodMock = DispatchInvocationToArrangements(callPattern, invocation);1340            if (!invocation.InArrange && !invocation.InAssertSet)1341            {1342                funcRoot.AddOrUpdateOccurence(callPattern, methodMock);1343            }1344            return methodMock != null;1345        }1346        private IMethodMock DispatchInvocationToArrangements(CallPattern callPattern, Invocation invocation)1347        {1348            MethodInfoMatcherTreeNode arrangeFuncRoot;1349            var methodMockNodes = new List<MethodMockMatcherTreeNode>();1350            var allMethods = new[] { callPattern.Method }1351                .Concat(callPattern.Method.GetInheritanceChain().Where(m => m.DeclaringType.IsInterface));1352            foreach (var method in allMethods)1353            {1354                DebugView.TraceEvent(IndentLevel.MethodMatch, () => String.Format("Inspect arrangements on {0} on {1}", method, method.DeclaringType));1355                if (!arrangementTreeRoots.TryGetValue(method, out arrangeFuncRoot))1356                    continue;1357                var results = arrangeFuncRoot.GetMethodMock(callPattern);1358                methodMockNodes.AddRange(results);1359            }1360            var methodMock = GetMethodMockFromNodes(methodMockNodes, invocation);1361            if (methodMock == null)1362            {1363                DebugView.TraceEvent(IndentLevel.MethodMatch, () => "No arrangement chosen");1364                return null;1365            }1366            DebugView.TraceEvent(IndentLevel.MethodMatch, () => String.Format("Chosen arrangement (id={0}) {1}",1367                methodMockNodes.First(node => node.MethodMock == methodMock).Id, methodMock.ArrangementExpression));1368            methodMock.IsUsed = true; //used to correctly determine inSequence arranges1369            var behaviorsToProcess = GetBehaviorsToProcess(invocation, methodMock);1370            foreach (var behavior in behaviorsToProcess)1371            {1372                behavior.Process(invocation);1373            }1374            return methodMock;1375        }1376        private static List<IBehavior> GetBehaviorsToProcess(Invocation invocation, IMethodMock methodMock)1377        {1378            var behaviorsToExecute = new List<IBehavior>();1379            var behaviorTypesToSkip = GetBehaviorTypesToSkip(invocation);1380            behaviorsToExecute.AddRange(1381                methodMock.Behaviors.Where(behavior => !behaviorTypesToSkip.Contains(behavior.GetType())));1382            var mock = invocation.MockMixin;1383            if (mock != null)1384            {1385                behaviorsToExecute.AddRange(mock.SupplementaryBehaviors);1386#if !PORTABLE1387                // explicitly add recursive mocking behavior for ref returns in order to set invocation result1388                if (invocation.Method.GetReturnType().IsByRef)1389                {1390                    behaviorsToExecute.AddRange(1391                        mock.FallbackBehaviors.Where(1392                            behavior =>1393                                behavior is CallOriginalBehavior1394                                || (behavior is RecursiveMockingBehavior && ((RecursiveMockingBehavior)behavior).Type != RecursiveMockingBehaviorType.OnlyDuringAnalysis)));1395                }1396#endif1397            }1398            return behaviorsToExecute;1399        }1400        private static List<Type> GetBehaviorTypesToSkip(Invocation invocation)1401        {1402            var behaviorTypesToSkip = new List<Type>();1403            if (invocation.InAssertSet)1404            {1405                behaviorTypesToSkip.Add(typeof(InvocationOccurrenceBehavior));1406            }1407            return behaviorTypesToSkip;1408        }1409        private bool TryCreateDelegate(Type type, MockCreationSettings settings, out object delegateResult)1410        {1411            delegateResult = null;1412            if (!typeof(Delegate).IsAssignableFrom(type) || type == typeof(Delegate) || type == typeof(MulticastDelegate))1413                return false;1414            var backendType = mockFactory.CreateDelegateBackend(type);1415            var backend = Create(backendType, settings);1416            delegateResult = Delegate.CreateDelegate(type, backend, backendType.GetMethod("Invoke"));1417            return true;1418        }1419        private IMethodMock GetMethodMockFromNodes(List<MethodMockMatcherTreeNode> methodMockNodes, Invocation invocation)1420        {1421            if (methodMockNodes.Count == 0)1422            {1423                return null;1424            }1425            var resultList =1426                methodMockNodes1427                    .OrderBy(x => x.Id)1428                    .Select(1429                        x =>1430                            new1431                            {1432                                x.MethodMock,1433                                Acceptable = new Lazy<bool>(() => x.MethodMock.AcceptCondition == null1434                                    || (bool)x.MethodMock.AcceptCondition.CallOverride(invocation))1435                            })1436                    .ToList();1437            var isInOrderOverwrites =1438                resultList.Count() > 01439                && resultList.Where(x => x.MethodMock.IsInOrder).Any()1440                && resultList.Last().MethodMock.IsInOrder;1441            // if one or more InOrder arrangement overwrites other ones, then skip selecting others1442            if (!isInOrderOverwrites)1443            {1444                var nonSequentialOrInOrder =1445                    resultList.Where(x => !x.MethodMock.IsSequential && !x.MethodMock.IsInOrder && x.Acceptable).LastOrDefault();1446                if (nonSequentialOrInOrder != null)1447                {1448                    return nonSequentialOrInOrder.MethodMock;1449                }1450            }1451            var inOrder = resultList.Where(x => x.MethodMock.IsInOrder && !x.MethodMock.IsUsed && x.Acceptable).FirstOrDefault();1452            if (inOrder != null)1453            {1454                return inOrder.MethodMock;1455            }1456            var sequential = resultList.Where(x => x.MethodMock.IsSequential && !x.MethodMock.IsUsed && x.Acceptable).FirstOrDefault();1457            if (sequential != null)1458            {1459                return sequential.MethodMock;1460            }1461            return resultList.Where(x => (x.MethodMock.IsSequential || x.MethodMock.IsInOrder) && x.Acceptable).Select(x => x.MethodMock).LastOrDefault();1462        }1463        internal string GetDebugView(object mock = null)1464        {1465            IEnumerable<MethodMockMatcherTreeNode> nodes;1466            if (mock != null)1467            {1468                nodes = GetMethodMocksFromObject(mock);1469            }1470            else1471            {1472                nodes = from kvp in this.arrangementTreeRoots1473                        let universalCP = CallPattern.CreateUniversalCallPattern(kvp.Key)1474                        from node in kvp.Value.GetAllMethodMocks(universalCP)1475                        select node;1476            }1477            var sb = new StringBuilder();1478            sb.AppendFormat("Elevated mocking: {0}\n", ProfilerInterceptor.IsProfilerAttached ? "enabled" : "disabled");1479            sb.AppendLine("\nArrangements and expectations:");1480            bool addedStuff = false;1481            foreach (var node in nodes)1482            {...MethodInfoMatcherTreeNode.cs
Source:MethodInfoMatcherTreeNode.cs  
...41		}42		public List<MethodMockMatcherTreeNode> GetAllMethodMocks(CallPattern callPattern)43		{44			List<MethodMockMatcherTreeNode> results = new List<MethodMockMatcherTreeNode>();45			GetMethodMockInternal(callPattern, 0, results, MatchingOptions.Concretizing);46			return results;47		}48		public List<MethodMockMatcherTreeNode> GetMethodMock(CallPattern callPattern)49		{50			List<MethodMockMatcherTreeNode> results = new List<MethodMockMatcherTreeNode>();51			GetMethodMockInternal(callPattern, 0, results, MatchingOptions.Generalizing);52			return results;53		}54		public void AddOrUpdateOccurence(CallPattern callPattern, IMethodMock mock)55		{56			AddOrUpdateOccurenceInternal(callPattern, 0, mock);57		}58		public List<OccurrencesMatcherTreeNode> GetOccurences(CallPattern callPattern)59		{60			List<OccurrencesMatcherTreeNode> results = new List<OccurrencesMatcherTreeNode>();61			GetOccurencesInternal(callPattern, 0, results);62			return results;63		}64	}65}...GetMethodMock
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Telerik.JustMock;7using Telerik.JustMock.Core.MatcherTree;8using Telerik.JustMock.Helpers;9{10    {11        static void Main(string[] args)12        {13            var mock = Mock.Create<IFoo>();14            Mock.Arrange(() => mock.Bar()).Returns(1);15            Mock.Arrange(() => mock.GetMethodMock()).Returns(2);16            Console.WriteLine(mock.Bar());17            Console.WriteLine(mock.GetMethodMock());18            Console.ReadKey();19        }20    }21    {22        int Bar();23        int GetMethodMock();24    }25}GetMethodMock
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Telerik.JustMock;7using Telerik.JustMock.Core.MatcherTree;8{9    {10        public void Method1()11        {12            var mock = Mock.Create<Class1>();13            var methodMock = mock.GetMethodMock(x => x.Method1());14            methodMock.Returns(1);15        }16    }17}GetMethodMock
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Telerik.JustMock;7using Telerik.JustMock.Core.MatcherTree;8using Telerik.JustMock.Core;9{10    {11        public void Method1()12        {13            Console.WriteLine("Method1");14        }15    }16    {17        public void Method2()18        {19            Console.WriteLine("Method2");20        }21    }22    {23        public void Method3()24        {25            Console.WriteLine("Method3");26        }27    }28    {29        public void Method4()30        {31            Console.WriteLine("Method4");32        }33    }34    {35        public void Method5()36        {37            Console.WriteLine("Method5");38        }39    }40    {41        public void Method6()42        {43            Console.WriteLine("Method6");44        }45    }46    {47        public void Method7()48        {49            Console.WriteLine("Method7");50        }51    }52    {53        public void Method8()54        {55            Console.WriteLine("Method8");56        }57    }58    {59        public void Method9()60        {61            Console.WriteLine("Method9");62        }63    }64    {65        public void Method10()66        {67            Console.WriteLine("Method10");68        }69    }70    {71        public void Method11()72        {73            Console.WriteLine("Method11");74        }75    }76    {77        public void Method12()78        {79            Console.WriteLine("Method12");80        }81    }82    {83        public void Method13()84        {85            Console.WriteLine("Method13");86        }87    }88    {89        public void Method14()90        {91            Console.WriteLine("Method14");92        }93    }94    {95        public void Method15()96        {97            Console.WriteLine("Method15");98        }99    }100    {101        public void Method16()102        {103            Console.WriteLine("Method16");104        }105    }106    {107        public void Method17()108        {GetMethodMock
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Telerik.JustMock;7using Telerik.JustMock.Core.MatcherTree;8using Telerik.JustMock.Helpers;9{10    {11        static void Main(string[] args)12        {13            var mock = Mock.Create<TestClass>();14            MethodInfoMatcherTreeNode methodInfoMatcherTreeNode = Mock.GetMethodMock(mock, "TestMethod");GetMethodMock
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Telerik.JustMock;7using Telerik.JustMock.Core;8{9    {10        public Class1()11        {12            var matcherTree = Mock.CreateMatcherTree();13            var methodInfoMatcherTreeNode = matcherTree.GetMethodMock("TestMethod");14            methodInfoMatcherTreeNode.GetMethodMock("TestMethod1");15            methodInfoMatcherTreeNode.GetMethodMock("TestMethod2");16            methodInfoMatcherTreeNode.GetMethodMock("TestMethod3");17            methodInfoMatcherTreeNode.GetMethodMock("TestMethod4");18        }19    }20}21using System;22using System.Collections.Generic;23using System.Linq;24using System.Text;25using System.Threading.Tasks;26using Telerik.JustMock;27using Telerik.JustMock.Core;28{29    {30        public Class1()31        {32            var matcherTree = Mock.CreateMatcherTree();33            var methodInfoMatcherTreeNode = matcherTree.GetMethodMock("TestMethod");34            methodInfoMatcherTreeNode.GetMethodMock("TestMethod1");35            methodInfoMatcherTreeNode.GetMethodMock("TestMethod2");36            methodInfoMatcherTreeNode.GetMethodMock("TestMethod3");37            methodInfoMatcherTreeNode.GetMethodMock("TestMethod4");38        }39    }40}41using System;42using System.Collections.Generic;43using System.Linq;44using System.Text;45using System.Threading.Tasks;46using Telerik.JustMock;47using Telerik.JustMock.Core;48{49    {50        public Class1()51        {52            var matcherTree = Mock.CreateMatcherTree();53            var methodInfoMatcherTreeNode = matcherTree.GetMethodMock("TestMethod");54            methodInfoMatcherTreeNode.GetMethodMock("TestMethod1");55            methodInfoMatcherTreeNode.GetMethodMock("TestMethod2");56            methodInfoMatcherTreeNode.GetMethodMock("TestMethod3");57            methodInfoMatcherTreeNode.GetMethodMock("TestMethod4");58        }59    }60}61using System;62using System.Collections.Generic;GetMethodMock
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using Telerik.JustMock;6using Telerik.JustMock.Core.MatcherTree;7using Telerik.JustMock.Helpers;8using Telerik.JustMock.Core;9{10    {11        public void GetMethodMockMethod()12        {13            var mock = Mock.Create<TestClass>();14            var methodMock = Mock.GetMethodMock(mock, x => x.Method());15            methodMock.Arrange(x => x.Method()).Returns(1);16            Assert.AreEqual(1, mock.Method());17        }18    }19    {20        public virtual int Method()21        {22            return 0;23        }24    }25}GetMethodMock
Using AI Code Generation
1Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod"));2Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode1 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod"));3Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode2 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod1"));4Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode3 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod2"));5Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode4 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod3"));6Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode5 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod4"));7Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode6 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod5"));8Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode7 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod6"));9Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode8 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod7"));10Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode9 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod8"));11Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode10 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod9"));12Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode11 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1).GetMethod("TestMethod10"));13Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode methodInfoMatcherTreeNode12 = new Telerik.JustMock.Core.MatcherTree.MethodInfoMatcherTreeNode(typeof(1GetMethodMock
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using Telerik.JustMock;6using Telerik.JustMock.Core;7using Telerik.JustMock.Core.MatcherTree;8using Telerik.JustMock.Helpers;9using Telerik.JustMock.Test;10using Telerik.JustMock.Test.Demo;11using Telerik.JustMock.Test.Demo.Model;12{13    {14        static void Main(string[] args)15        {16            var mock = Mock.Create<ISomeInterface>();17            Mock.Arrange(() => mock.SomeMethod()).Returns(1);18            Mock.Arrange(() => mock.SomeMethod()).DoNothing();19            Mock.Arrange(() => mock.SomeMethod()).Throws(new Exception());20            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled();21            Mock.Arrange(() => mock.SomeMethod()).AssertWasNotCalled();22            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1);23            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2);24            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3);25            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3, 4);26            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3, 4, 5);27            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3, 4, 5, 6);28            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3, 4, 5, 6, 7);29            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3, 4, 5, 6, 7, 8);30            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3, 4, 5, 6, 7, 8, 9);31            Mock.Arrange(() => mock.SomeMethod()).AssertWasCalled(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);GetMethodMock
Using AI Code Generation
1using Telerik.JustMock.Core.MatcherTree;2var mock = Mock.Create<IFoo>();3MethodInfoMatcherTreeNode.GetMethodMock(mock, "Bar").Returns(1);4using Telerik.JustMock.Core.MatcherTree;5var mock = Mock.Create<IFoo>();6MethodInfoMatcherTreeNode.GetMethodMock(mock, "Bar", new Type[] { }).Returns(1);7using Telerik.JustMock.Core.MatcherTree;8var mock = Mock.Create<IFoo>();9MethodInfoMatcherTreeNode.GetMethodMock(mock, "Bar", new Type[] { typeof(int) }).Returns(1);10using Telerik.JustMock.Core.MatcherTree;11var mock = Mock.Create<IFoo>();12MethodInfoMatcherTreeNode.GetMethodMock(mock, "Bar", new Type[] { typeof(int), typeof(string) }).Returns(1);13using Telerik.JustMock.Core.MatcherTree;14var mock = Mock.Create<IFoo>();15MethodInfoMatcherTreeNode.GetMethodMock(mock, "Bar", new Type[] { typeof(int), typeof(string), typeof(bool) }).Returns(1);16using Telerik.JustMock.Core.MatcherTree;17var mock = Mock.Create<IFoo>();18MethodInfoMatcherTreeNode.GetMethodMock(mock, "Bar", new Type[] { typeof(int), typeof(string), typeof(bool), typeof(object) }).Returns(1);19using Telerik.JustMock.Core.MatcherTree;20var mock = Mock.Create<IFoo>();21MethodInfoMatcherTreeNode.GetMethodMock(mock, "Bar", new Type[] { typeof(int), typeof(string), typeof(bool), typeof(object), typeof(IFoo) }).Returns(1);Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
