public static class MoqExtensions
{
private static IEqualityComparer _equalityComparer;
public static void SetEqualityComparer(IEqualityComparer equalityComparer)
{
_equalityComparer = equalityComparer;
}
public static ISetup<T> ValueSetup<T>(this Mock<T> mock, Expression<Action<T>> expression)
where T : class
{
var updatedExpression = (Expression<Action<T>>)new MyExpressionVisitor().Visit(expression);
return mock.Setup(updatedExpression);
}
public static T Match<T>(this T instance)
{
return It.Is<T>(t => _equalityComparer.Equals(instance, t));
}
private class MyExpressionVisitor : ExpressionVisitor
{
protected override Expression VisitMember(MemberExpression node)
{
if(node.Expression.NodeType == ExpressionType.Constant)
{
// We have to do this to get access to the base value and not the wrapped value
var param = Expression.Constant(Expression.Lambda(node).Compile().DynamicInvoke());
var call = Expression.Call(typeof(MoqExtensions), "Match", new[] { node.Type }, param);
return call;
}
return base.VisitMember(node);
}
}
}