public void CreateConvertExpression_MultipleCases_ConvertsCorrectly( Type sourceType, Type targetType, string sourcePropertyName, string targetPropertyName, object sourcePropertyValue) { var target = new PropertyConverter(); var fixture = new Fixture(); var createMethod = fixture.GetType().GetMethod("CreateAnonymous"); var sourceObject = Activator.CreateInstance(sourceType); var targetObject = Activator.CreateInstance(targetType); var sourceParam = Expression.Parameter(sourceType); var targetParam = Expression.Parameter(targetType); var sourceProp = sourceType.GetProperty(sourcePropertyName); var targetProp = targetType.GetProperty(targetPropertyName); if (sourcePropertyValue != null) { sourceProp.SetValue(sourceObject, sourcePropertyValue, null); } var expr = target.CreateConvertExpression( sourceProp, targetProp, sourceParam, targetParam); var actionType = typeof(MappingAction <,>).MakeGenericType(sourceType, targetType); var lambda = Expression.Lambda(actionType, expr, sourceParam, targetParam); var action = lambda.Compile(); action.DynamicInvoke(sourceObject, targetObject); var resultProp = targetProp.GetValue(targetObject, null); resultProp.ShouldBe(sourcePropertyValue); }