Best JustMockLite code snippet using Telerik.JustMock.Core.Behaviors.PreserveRefOutValuesBehavior.GetParameters
MocksRepository.cs
Source:MocksRepository.cs  
...414                    ObjectInfo[] invocationsArgInfos =415                        invocation.Args.Select(416                                (arg, index) =>417                                    {418                                        var argInfo = CreateObjectInfo(arg, invocation.Method.GetParameters()[index].ParameterType);419                                        return argInfo;420                                    }).ToArray();421                    ObjectInfo invocationInstanceInfo = ObjectInfo.FromObject(invocation.Instance ?? invocation.Method.DeclaringType);422                    ObjectInfo invocationResultInfo = CreateObjectInfo(invocation.ReturnValue, invocation.Method.GetReturnType());423                    var invocationInfo = new InvocationInfo(invocationInstanceInfo, invocationsArgInfos, invocationResultInfo);424                    debugWindowPlugin.MockInvoked(425                        invocation.Repository.RepositoryId,426                        invocation.Repository.GetRepositoryPath(),427                        mockInfo,428                        invocationInfo);429                }430            }431            catch (Exception e)432            {433                System.Diagnostics.Trace.WriteLine("Exception thrown calling IDebugWindowPlugin plugin: " + e);434            }435#endif436        }437        internal T GetValue<T>(object owner, object key, T dflt)438        {439            object value;440            if (valueStore.TryGetValue(new KeyValuePair<object, object>(owner, key), out value))441            {442                return (T)value;443            }444            else445            {446                return dflt;447            }448        }449        internal void StoreValue<T>(object owner, object key, T value)450        {451            valueStore[new KeyValuePair<object, object>(owner, key)] = value;452        }453        internal IDisposable StartRecording(IRecorder recorder, bool dispatchToMethodMocks)454        {455            return this.sharedContext.StartRecording(recorder, dispatchToMethodMocks);456        }457        internal IDisposable StartArrangeArgMatching()458        {459            return this.sharedContext.StartArrangeArgMatching();460        }461        internal void AddMatcherInContext(IMatcher matcher)462        {463            if (!this.sharedContext.InArrange || this.sharedContext.Recorder != null)464            {465                this.MatchersInContext.Add(matcher);466            }467        }468        internal object Create(Type type, MockCreationSettings settings)469        {470            object delegateResult;471            if (TryCreateDelegate(type, settings, out delegateResult))472            {473                return delegateResult;474            }475            bool isSafeMock = settings.FallbackBehaviors.OfType<CallOriginalBehavior>().Any();476            this.CheckIfCanMock(type, !isSafeMock);477            this.EnableInterception(type);478            bool canCreateProxy = !type.IsSealed;479            MockMixin mockMixinImpl = this.CreateMockMixin(type, settings);480            ConstructorInfo[] ctors = type.GetConstructors();481            bool isCoclass = ctors.Any(ctor => ctor.IsExtern());482            bool hasAdditionalInterfaces = settings.AdditionalMockedInterfaces != null && settings.AdditionalMockedInterfaces.Length > 0;483            bool hasAdditionalProxyTypeAttributes = settings.AdditionalProxyTypeAttributes != null && settings.AdditionalProxyTypeAttributes.Any();484            bool shouldCreateProxy = settings.MustCreateProxy485                || hasAdditionalInterfaces486                || isCoclass487                || type.IsAbstract || type.IsInterface488                || !settings.MockConstructorCall489                || hasAdditionalProxyTypeAttributes490                || !ProfilerInterceptor.IsProfilerAttached491                || !ProfilerInterceptor.TypeSupportsInstrumentation(type);492            bool createTransparentProxy = MockingProxy.CanCreate(type) && !ProfilerInterceptor.IsProfilerAttached;493            Exception proxyFailure = null;494            object instance = null;495            if (canCreateProxy && shouldCreateProxy)496            {497                try498                {499                    instance = mockFactory.Create(type, this, mockMixinImpl, settings, createTransparentProxy);500                }501                catch (ProxyFailureException ex)502                {503                    proxyFailure = ex.InnerException;504                }505            }506            IMockMixin mockMixin = instance as IMockMixin;507            if (instance == null)508            {509                if (type.IsInterface || type.IsAbstract)510                    throw new MockException(String.Format("Abstract type '{0}' is not accessible for inheritance.", type));511                if (hasAdditionalInterfaces)512                    throw new MockException(String.Format("Type '{0}' is not accessible for inheritance. Cannot create mock object implementing the specified additional interfaces.", type));513                if (!ProfilerInterceptor.IsProfilerAttached && !createTransparentProxy)514                    ProfilerInterceptor.ThrowElevatedMockingException(type);515                if (settings.MockConstructorCall && type.IsValueType)516                {517                    settings.MockConstructorCall = false;518                    settings.Args = null;519                }520                if (!settings.MockConstructorCall)521                {522                    try523                    {524                        instance = type.CreateObject(settings.Args);525                    }526                    catch (MissingMethodException)527                    {528                        settings.MockConstructorCall = true;529                    }530                }531                if (settings.MockConstructorCall)532                {533                    instance = MockingUtil.GetUninitializedObject(type);534                }535                if (!createTransparentProxy)536                {537                    mockMixin = this.CreateExternalMockMixin(type, instance, settings);538                }539            }540            else541            {542                this.controlledMocks.Add(new WeakReference(instance));543            }544            if (type.IsClass)545                GC.SuppressFinalize(instance);546            if (createTransparentProxy)547            {548                if (mockMixin == null)549                {550                    mockMixin = mockMixinImpl;551                }552                instance = MockingProxy.CreateProxy(instance, this, mockMixin);553            }554            mockMixin.IsInstanceConstructorMocked = settings.MockConstructorCall;555            return instance;556        }557        internal IMockMixin CreateExternalMockMixin(Type mockObjectType, object mockObject, MockCreationSettings settings)558        {559            if (mockObjectType == null)560            {561                if (mockObject == null)562                    throw new ArgumentNullException("mockObject");563                mockObjectType = mockObject.GetType();564            }565            this.EnableInterception(mockObjectType);566            if (mockObject == null)567                throw new MockException(String.Format("Failed to create instance of type '{0}'", mockObjectType));568            MockMixin mockMixin = this.CreateMockMixin(mockObjectType, settings, false);569            IMockMixin compoundMockMixin = mockFactory.CreateExternalMockMixin(mockMixin, settings.Mixins);570            lock (externalMixinDatabase)571            {572                if (mockObjectType.IsValueType())573                {574                    externalMixinDatabase.RemoveAll(kvp => kvp.Key.Equals(mockObject));575                    externalMixinDatabase.Add(new KeyValuePair<object, IMockMixin>(mockObject, compoundMockMixin));576                }577                else578                {579                    externalReferenceMixinDatabase.Add(mockObject, compoundMockMixin);580                }581                compoundMockMixin.ExternalizedMock = mockObject;582                this.controlledMocks.Add(new WeakReference(compoundMockMixin));583            }584            return compoundMockMixin;585        }586        internal ProxyTypeInfo CreateClassProxyType(Type classToProxy, MockCreationSettings settings)587        {588            MockMixin mockMixinImpl = this.CreateMockMixin(classToProxy, settings);589            return mockFactory.CreateClassProxyType(classToProxy, this, settings, mockMixinImpl);590        }591        private void CheckIfCanMock(Type type, bool checkSafety)592        {593            if (KnownUnmockableTypes.Contains(type)594                || typeof(Delegate).IsAssignableFrom(type))595                throw new MockException("Cannot create mock for type due to CLR limitations.");596            if (checkSafety)597                ProfilerInterceptor.CheckIfSafeToInterceptWholesale(type);598        }599        internal void InterceptStatics(Type type, MockCreationSettings settings, bool mockStaticConstructor)600        {601            if (!ProfilerInterceptor.IsProfilerAttached)602                ProfilerInterceptor.ThrowElevatedMockingException(type);603            if (!settings.FallbackBehaviors.OfType<CallOriginalBehavior>().Any())604                ProfilerInterceptor.CheckIfSafeToInterceptWholesale(type);605            var mockMixin = (IMockMixin)Create(typeof(ExternalMockMixin),606                new MockCreationSettings607                {608                    Mixins = settings.Mixins,609                    SupplementaryBehaviors = settings.SupplementaryBehaviors,610                    FallbackBehaviors = settings.FallbackBehaviors,611                    MustCreateProxy = true,612                });613            mockMixin.IsStaticConstructorMocked = mockStaticConstructor;614            lock (staticMixinDatabase)615                staticMixinDatabase[type] = mockMixin;616            this.EnableInterception(type);617        }618        private MockMixin CreateMockMixin(Type declaringType, MockCreationSettings settings)619        {620            return CreateMockMixin(declaringType, settings, settings.MockConstructorCall);621        }622        private MockMixin CreateMockMixin(Type declaringType, MockCreationSettings settings, bool mockConstructorCall)623        {624            var mockMixin = new MockMixin625            {626                Repository = this,627                DeclaringType = declaringType,628                IsInstanceConstructorMocked = mockConstructorCall,629            };630            foreach (var behavior in settings.SupplementaryBehaviors)631                mockMixin.SupplementaryBehaviors.Add(behavior);632            foreach (var behavior in settings.FallbackBehaviors)633                mockMixin.FallbackBehaviors.Add(behavior);634            return mockMixin;635        }636        [ArrangeMethod]637        internal TMethodMock Arrange<TMethodMock>(Expression expression, Func<TMethodMock> methodMockFactory)638            where TMethodMock : IMethodMock639        {640            TMethodMock result = methodMockFactory();641            using (this.sharedContext.StartArrange())642            {643                result.Repository = this;644                result.ArrangementExpression = ExpressionUtil.ConvertMockExpressionToString(expression);645                result.CallPattern = CallPatternCreator.FromExpression(this, expression);646                AddArrange(result);647            }648#if !PORTABLE649            var createInstanceLambda = ActivatorCreateInstanceTBehavior.TryCreateArrangementExpression(result.CallPattern.Method);650            if (createInstanceLambda != null)651            {652                var createInstanceMethodMock = Arrange(createInstanceLambda, methodMockFactory);653                ActivatorCreateInstanceTBehavior.Attach(result, createInstanceMethodMock);654            }655#endif656            return result;657        }658        /// <summary>659        /// Since we are not able to record deffered execution, check whether mock is about to present660        /// IQueryable<> or IEnumerable<>. If it so, then throw an exception to prompt the user to use661        /// Mock.Arrange overloads with expressions.662        /// See also https://stackoverflow.com/questions/3894490/linq-what-is-the-quickest-way-to-find-out-deferred-execution-or-not663        /// </summary>664        /// <typeparam name="TMethodMock">Mock return type</typeparam>665        /// <param name="methodMockFactory">Mock factory</param>666        private void CheckDefferedExecutionTypes<TMethodMock>(Func<TMethodMock> methodMockFactory)667        {668            var mockFactoryType = methodMockFactory.GetType().GetGenericArguments().FirstOrDefault();669            if (mockFactoryType.IsGenericType && mockFactoryType.GetGenericTypeDefinition() == typeof(FuncExpectation<>))670            {671                var mockFactoryGenericArguments = mockFactoryType.GetGenericArguments();672                if (mockFactoryGenericArguments673                        .Where(a => a.IsGenericType)674                        .Where(a => a.GetGenericTypeDefinition() == typeof(IQueryable<>)675                            || a.GetGenericTypeDefinition() == typeof(IEnumerable<>))676                        .Any())677                {678                    throw new MockException("Cannot arrange action with potential deffered execution, use Mock.Arrange with expressions instead.");679                }680            }681        }682        [ArrangeMethod]683        internal TMethodMock Arrange<TMethodMock>(Action memberAction, Func<TMethodMock> methodMockFactory)684            where TMethodMock : IMethodMock685        {686            using (this.sharedContext.StartArrange())687            {688                var result = methodMockFactory();689                CheckDefferedExecutionTypes(methodMockFactory);690                result.Repository = this;691                result.CallPattern = CallPatternCreator.FromAction(this, memberAction);692                AddArrange(result);693                return result;694            }695        }696        [ArrangeMethod]697        internal TMethodMock Arrange<TMethodMock>(object instance, MethodBase method, object[] arguments, Func<TMethodMock> methodMockFactory)698            where TMethodMock : IMethodMock699        {700            using (this.sharedContext.StartArrange())701            {702                var result = methodMockFactory();703                result.Repository = this;704                result.CallPattern = CallPatternCreator.FromMethodBase(this, instance, method, arguments);705                AddArrange(result);706                return result;707            }708        }709        [ArrangeMethod]710        internal TMethodMock Arrange<TMethodMock>(CallPattern callPattern, Func<TMethodMock> methodMockFactory)711            where TMethodMock : IMethodMock712        {713            using (this.sharedContext.StartArrange())714            {715                var result = methodMockFactory();716                result.Repository = this;717                result.CallPattern = callPattern;718                AddArrange(result);719                return result;720            }721        }722        private void AssertBehaviorsForMocks(IEnumerable<IMethodMock> mocks, bool ignoreMethodMockOccurrences)723        {724            foreach (var methodMock in mocks)725            {726                bool occurrenceAsserted = ignoreMethodMockOccurrences;727                if (!ignoreMethodMockOccurrences728                    && !methodMock.OccurencesBehavior.LowerBound.HasValue729                    && !methodMock.OccurencesBehavior.UpperBound.HasValue)730                {731                    methodMock.OccurencesBehavior.Assert(1, null);732                    occurrenceAsserted = true;733                }734                foreach (var behavior in methodMock.Behaviors.OfType<IAssertableBehavior>())735                    if (!occurrenceAsserted || behavior != methodMock.OccurencesBehavior)736                        behavior.Assert();737            }738        }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            }...PreserveRefOutValuesBehavior.cs
Source:PreserveRefOutValuesBehavior.cs  
...24		public PreserveRefOutValuesBehavior(IMethodMock methodMock)25		{26			var argMatchers = methodMock.CallPattern.ArgumentMatchers;27			var method = methodMock.CallPattern.Method;28			var parameters = GetParameters(method);29			var offsetDueToExtensionMethod = method.IsExtensionMethod() ? 1 : 0;30			for (int i = 0; i < parameters.Length; ++i)31			{32				if (!parameters[i].ParameterType.IsByRef || argMatchers[i].ProtectRefOut)33					continue;34				var matcher = argMatchers[i] as IValueMatcher;35				if (matcher == null)36					continue;37				var value = matcher.Value;38				values.Add(i + offsetDueToExtensionMethod, value);39			}40		}41		public void Process(Invocation invocation)42		{43			foreach (var kvp in this.values)44			{45				invocation.Args[kvp.Key] = kvp.Value;46			}47		}48		public static void Attach(IMethodMock methodMock)49		{50			var behavior = new PreserveRefOutValuesBehavior(methodMock);51			var madeReplacements = ReplaceRefOutArgsWithAnyMatcher(methodMock.CallPattern);52			if (madeReplacements)53				methodMock.Behaviors.Add(behavior);54		}55		public static bool ReplaceRefOutArgsWithAnyMatcher(CallPattern callPattern)56		{57			bool madeReplacements = false;58			var parameters = GetParameters(callPattern.Method);59			for (int i = 0; i < parameters.Length; ++i)60			{61				if (parameters[i].ParameterType.IsByRef && !callPattern.ArgumentMatchers[i].ProtectRefOut)62				{63					callPattern.ArgumentMatchers[i] = new AnyMatcher();64					madeReplacements = true;65				}66			}67			return madeReplacements;68		}69		private static ParameterInfo[] GetParameters(MethodBase method)70		{71			var parameters = method.GetParameters();72			if (method.IsExtensionMethod())73				parameters = parameters.Skip(1).ToArray();74			return parameters;75		}76	}77}...GetParameters
Using AI Code Generation
1{2    using System;3    using System.Collections.Generic;4    using System.Linq;5    using System.Text;6    using Telerik.JustMock;7    using Telerik.JustMock.Core;8    using Telerik.JustMock.Helpers;9    {10        static void Main(string[] args)11        {12            var mock = Mock.Create<IFoo>();13            Mock.Arrange(() => mock.Execute(Arg.AnyString, Arg.AnyInt)).DoNothing();14            var behavior = Mock.NonPublic.GetBehavior(mock) as PreserveRefOutValuesBehavior;15            var parameters = behavior.GetParameters(mock, "Execute", new object[] { "test", 1 });16            Console.WriteLine("Parameters: ");17            foreach (var parameter in parameters)18            {19                Console.WriteLine(parameter);20            }21        }22    }23    {24        void Execute(string str, int i);25    }26}27{28    using System;29    using System.Collections.Generic;30    using System.Linq;31    using System.Text;32    using Telerik.JustMock;33    using Telerik.JustMock.Core;34    using Telerik.JustMock.Helpers;35    {36        static void Main(string[] args)37        {38            var mock = Mock.Create<IFoo>();39            Mock.Arrange(() => mock.Execute(Arg.AnyString, Arg.AnyInt)).DoNothing();40            var behavior = Mock.NonPublic.GetBehavior(mock) as PreserveRefOutValuesBehavior;41            var parameters = behavior.GetParameters(mock, "Execute", new object[] { "test", 1 });42            Console.WriteLine("Parameters: ");43            foreach (var parameter in parameters)44            {45                Console.WriteLine(parameter);46            }47        }48    }49    {50        void Execute(string str, int i);51    }52}53{54    using System;55    using System.Collections.Generic;56    using System.Linq;57    using System.Text;58    using Telerik.JustMock;59    using Telerik.JustMock.Core;60    using Telerik.JustMock.Helpers;61    {62        static void Main(string[]GetParameters
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using Telerik.JustMock;6using Telerik.JustMock.Core.Context;7using Telerik.JustMock.Core.Behaviors;8{9    {10        public void Method1(string str, ref int num, out int num1)11        {12            num1 = 0;13        }14    }15    {16        public void Method2()17        {18            Class1 obj = Mock.Create<Class1>();19            Mock.Arrange(() => obj.Method1(Arg.AnyString, Arg.AnyInt, Arg.AnyInt)).DoNothing();20            int num = 0;21            int num1;22            obj.Method1("test", ref num, out num1);23            var parameters = Mock.GetBehavior(obj.Method1).GetParameters();24        }25    }26}GetParameters
Using AI Code Generation
1using Telerik.JustMock;2using Telerik.JustMock.Core;3using Telerik.JustMock.Helpers;4using System;5using System.Collections.Generic;6using System.Linq;7using System.Text;8using System.Threading.Tasks;9{10    {11        static void Main(string[] args)12        {13            var mock = Mock.Create<IFoo>();14            Mock.Arrange(() => mock.DoSomething(Arg.IsAny<int>(), Arg.IsAny<string>(), Arg.IsAny<bool>())).DoNothing().PreserveRefOutValues();15            int i = 0;16            string s = "Hello";17            bool b = true;18            mock.DoSomething(i, s, b);19            var parameters = mock.GetParameters();20            Console.WriteLine(parameters[0].Value);21            Console.WriteLine(parameters[1].Value);22            Console.WriteLine(parameters[2].Value);23            Console.ReadLine();24        }25    }26    {27        void DoSomething(int i, string s, bool b);28    }29}GetParameters
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using Telerik.JustMock;6using Telerik.JustMock.Helpers;7using System.Reflection;8{9    {10        public int GetParametersMethod(int a, int b, int c)11        {12            return 0;13        }14    }15    {16        static void Main(string[] args)17        {18            var mock = Mock.Create<GetParameters>();19            var behavior = new Telerik.JustMock.Core.Behaviors.PreserveRefOutValuesBehavior();20            var parameters = behavior.GetParameters(mock, typeof(GetParameters).GetMethod("GetParametersMethod"));21            foreach (var param in parameters)22            {23                Console.WriteLine(param.Name);24            }25        }26    }27}GetParameters
Using AI Code Generation
1using System;2using System.Reflection;3using Telerik.JustMock.Core.Behaviors;4{5    public static void Main()6    {7        var method = typeof(Program).GetMethod("Foo");8        var behavior = new PreserveRefOutValuesBehavior();9        var parameters = behavior.GetParameters(method, new object[] { 1, "2", 3.0, new object() });10        Console.WriteLine(parameters.Length);11    }12    public static void Foo(int a, string b, double c, object d)13    {14    }15}16using System;17using System.Reflection;18using Telerik.JustMock.Core.Behaviors;19{20    public static void Main()21    {22        var method = typeof(Program).GetMethod("Foo");23        var behavior = new PreserveRefOutValuesBehavior();24        var parameters = behavior.GetParameters(method, new object[] { 1, "2", 3.0, new object() });25        Console.WriteLine(parameters.Length);26    }27    public static void Foo(int a, string b, double c, object d)28    {29    }30}GetParameters
Using AI Code Generation
1public void GetParameters()2{3    var mock = Mock.Create<IFoo>();4    var behavior = new Telerik.JustMock.Core.Behaviors.PreserveRefOutValuesBehavior();5    var methodInfo = typeof(IFoo).GetMethod("DoSomething");6    var args = new object[] { 1, "bar" };7    var refArgs = new object[] { 1, "bar" };8    var outArgs = new object[2];9    var parameters = new object[] { 1, "bar", outArgs[0], outArgs[1] };10    behavior.GetParameters(mock, methodInfo, args, refArgs, outArgs, parameters);11    Assert.AreEqual(1, outArgs[0]);12    Assert.AreEqual("bar", outArgs[1]);13}14public void GetParameters()15{16    var mock = Mock.Create<IFoo>();17    var behavior = new Telerik.JustMock.Core.Behaviors.PreserveRefOutValuesBehavior();18    var methodInfo = typeof(IFoo).GetMethod("DoSomething");19    var args = new object[] { 1, "bar" };20    var refArgs = new object[] { 1, "bar" };21    var outArgs = new object[2];22    var parameters = new object[] { 1, "bar", outArgs[0], outArgs[1] };23    behavior.GetParameters(mock, methodInfo, args, refArgs, outArgs, parameters);24    Assert.AreEqual(1, outArgs[0]);25    Assert.AreEqual("bar", outArgs[1]);26}GetParameters
Using AI Code Generation
1using System;2using Telerik.JustMock;3using Telerik.JustMock.Helpers;4{5    {6        public static void Main(string[] args)7        {8            var mock = Mock.Create<ISomeInterface>();9            Mock.Arrange(() => mock.SomeMethod(Arg.AnyString, Arg.AnyInt)).DoNothing().MustBeCalled();10            mock.SomeMethod("test", 1);11            var parameters = mock.GetParameters(mock.SomeMethod);12            Console.WriteLine(parameters[0]);13            Console.WriteLine(parameters[1]);14        }15    }16    {17        void SomeMethod(string s, int i);18    }19}20using System;21using Telerik.JustMock;22using Telerik.JustMock.Helpers;23{24    {25        public static void Main(string[] args)26        {27            var mock = Mock.Create<ISomeInterface>();28            Mock.Arrange(() => mock.SomeMethod(Arg.AnyString, Arg.AnyInt)).DoNothing().MustBeCalled();29            mock.SomeMethod("test", 1);30            var parameters = mock.GetParameters(mock.SomeMethod);31            Console.WriteLine(parameters[0]);32            Console.WriteLine(parameters[1]);33        }34    }35    {36        void SomeMethod(string s, int i);37    }38}39using System;40using Telerik.JustMock;41using Telerik.JustMock.Helpers;42{43    {44        public static void Main(string[] args)45        {46            var mock = Mock.Create<ISomeInterface>();47            Mock.Arrange(() => mock.SomeMethod(Arg.AnyString, Arg.AnyInt)).DoNothing().MustBeCalled();48            mock.SomeMethod("test", 1);49            var parameters = mock.GetParameters(mock.SomeMethod);50            Console.WriteLine(parameters[0]);51            Console.WriteLine(parameters[1]);52        }53    }54    {55        void SomeMethod(string s, int i);56    }57}GetParameters
Using AI Code Generation
1using Telerik.JustMock;2{3    {4        public int GetParameters(out int x, ref int y)5        {6            x = 10;7            y = 20;8            return 30;9        }10    }11    {12        public static void Main(string[] args)13        {14            var testClass = Mock.Create<TestClass>();15            int x = 0;16            int y = 0;17            Mock.Arrange(() => testClass.GetParameters(out x, ref y)).DoInstead(() => y = 40).MustBeCalled();18            Mock.Arrange(() => testClass.GetParameters(out Arg.AnyInt, ref Arg.AnyInt)).DoInstead(() => y = 40).MustBeCalled();19            testClass.GetParameters(out x, ref y);20            Mock.Assert(testClass);21        }22    }23}GetParameters
Using AI Code Generation
1var mock = Mock.Create<IFoo>();2Mock.Arrange(() => mock.DoSomething(Arg.AnyString)).DoInstead(() =>3{4    var parameters = PreserveRefOutValuesBehavior.GetParameters();5    parameters[0] = "bar";6});7var mock = Mock.Create<IFoo>();8Mock.Arrange(() => mock.DoSomething(Arg.AnyString)).DoInstead(() =>9{10    var parameters = PreserveRefOutValuesBehavior.GetParameters();11    parameters[0] = "bar";12});13var mock = Mock.Create<IFoo>();14Mock.Arrange(() => mock.DoSomething(Arg.AnyString)).DoInstead(() =>15{16    var parameters = PreserveRefOutValuesBehavior.GetParameters();17    parameters[0] = "bar";18});19var mock = Mock.Create<IFoo>();20Mock.Arrange(() => mock.DoSomething(Arg.AnyString)).DoInstead(() =>21{22    var parameters = PreserveRefOutValuesBehavior.GetParameters();23    parameters[0] = "bar";24});25var mock = Mock.Create<IFoo>();26Mock.Arrange(() => mock.DoSomething(Arg.AnyString)).DoInstead(() =>27{28    var parameters = PreserveRefOutValuesBehavior.GetParameters();29    parameters[0] = "bar";30});31var mock = Mock.Create<IFoo>();32Mock.Arrange(() => mock.DoSomething(Arg.AnyString)).DoInstead(() =>33{34    var parameters = PreserveRefOutValuesBehavior.GetParameters();35    parameters[0] = "bar";36});37var mock = Mock.Create<IFoo>();38Mock.Arrange(() => mock.DoSomethingGetParameters
Using AI Code Generation
1using Telerik.JustMock;2using Telerik.JustMock.Core;3using Telerik.JustMock.Helpers;4{5    {6        void DoSomething(int value, out int result);7    }8    {9        static void Main(string[] args)10        {11            var mock = Mock.Create<ITest>();12            var behavior = mock.GetBehavior<PreserveRefOutValuesBehavior>();13            behavior.DoSomething(1, out int result);14            var parameters = behavior.GetParameters();15            Mock.Assert(() => mock.DoSomething(1, out result), Occurs.Exactly(1));16        }17    }18}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!!
