-
-
Notifications
You must be signed in to change notification settings - Fork 261
/
Copy pathMoqExtensions.cs
23 lines (18 loc) · 1.16 KB
/
MoqExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Reflection;
using Moq.Language;
using Moq.Language.Flow;
namespace Parse.Tests;
// MIT licensed, w/ attribution:
// http://stackoverflow.com/a/19598345/427309
public static class MoqExtensions
{
public delegate void OutAction<TOut>(out TOut outVal);
public delegate void OutAction<in T1, TOut>(T1 arg1, out TOut outVal);
public static IReturnsThrows<TMock, TReturn> OutCallback<TMock, TReturn, TOut>(this ICallback<TMock, TReturn> mock, OutAction<TOut> action) where TMock : class => OutCallbackInternal(mock, action);
public static IReturnsThrows<TMock, TReturn> OutCallback<TMock, TReturn, T1, TOut>(this ICallback<TMock, TReturn> mock, OutAction<T1, TOut> action) where TMock : class => OutCallbackInternal(mock, action);
private static IReturnsThrows<TMock, TReturn> OutCallbackInternal<TMock, TReturn>(ICallback<TMock, TReturn> mock, object action) where TMock : class
{
mock.GetType().Assembly.GetType("Moq.MethodCall").InvokeMember("SetCallbackWithArguments", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, mock, new[] { action });
return mock as IReturnsThrows<TMock, TReturn>;
}
}