From df421587c4ebc037af9e1cd51b3023a1d95f7472 Mon Sep 17 00:00:00 2001 From: Thomas Caudal Date: Wed, 22 Nov 2017 21:41:58 +0100 Subject: [PATCH 1/2] Improve error message when the creation of instantiation expression fails --- src/AutoMapper/ConstructorMap.cs | 4 +-- .../MoreExplanatoryExceptionTests.cs | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/UnitTests/Projection/MoreExplanatoryExceptionTests.cs diff --git a/src/AutoMapper/ConstructorMap.cs b/src/AutoMapper/ConstructorMap.cs index 76eaa3fcbe..e9f7c63085 100644 --- a/src/AutoMapper/ConstructorMap.cs +++ b/src/AutoMapper/ConstructorMap.cs @@ -42,8 +42,8 @@ public Expression NewExpression(Expression instanceParameter) var matchingExpressionConverter = ExpressionResultConverters.FirstOrDefault(c => c.CanGetExpressionResolutionResult(result, map)); - result = matchingExpressionConverter?.GetExpressionResolutionResult(result, map) - ?? throw new Exception("Can't resolve this to Queryable Expression"); + result = matchingExpressionConverter?.GetExpressionResolutionResult(result, map) + ?? throw new AutoMapperMappingException($"Unable to generate the instantiation expression for the constructor {Ctor}: no expression could be mapped for constructor parameter '{map.Parameter}'.", null, TypeMap.Types, null, null); return result; }); diff --git a/src/UnitTests/Projection/MoreExplanatoryExceptionTests.cs b/src/UnitTests/Projection/MoreExplanatoryExceptionTests.cs new file mode 100644 index 0000000000..6f38a1c1f7 --- /dev/null +++ b/src/UnitTests/Projection/MoreExplanatoryExceptionTests.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; +using AutoMapper.QueryableExtensions; + +namespace AutoMapper.UnitTests.Projection +{ + public class MoreExplanatoryExceptionTests + { + [Fact] + public void ConstructorWithUnknownParameterTypeThrowsExplicitException() + { + // Arrange + var config = new MapperConfiguration(cfg => + cfg.CreateMap()); + + // Act + var exception = Assert.Throws(() => + new EntitySource[0].AsQueryable().ProjectTo(config)); + + // Assert + Assert.Contains("object notSupported", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + class EntitySource + { + } + class EntityDestination + { + public EntityDestination(object notSupported = null) { } + } + } +} From 64becf994959b877963d72aa1c84876803e60cbc Mon Sep 17 00:00:00 2001 From: Lucian Bargaoanu Date: Thu, 23 Nov 2017 22:13:46 +0200 Subject: [PATCH 2/2] remove extra nulls --- src/AutoMapper/ConstructorMap.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AutoMapper/ConstructorMap.cs b/src/AutoMapper/ConstructorMap.cs index e9f7c63085..1dee32b9f3 100644 --- a/src/AutoMapper/ConstructorMap.cs +++ b/src/AutoMapper/ConstructorMap.cs @@ -43,7 +43,7 @@ public Expression NewExpression(Expression instanceParameter) ExpressionResultConverters.FirstOrDefault(c => c.CanGetExpressionResolutionResult(result, map)); result = matchingExpressionConverter?.GetExpressionResolutionResult(result, map) - ?? throw new AutoMapperMappingException($"Unable to generate the instantiation expression for the constructor {Ctor}: no expression could be mapped for constructor parameter '{map.Parameter}'.", null, TypeMap.Types, null, null); + ?? throw new AutoMapperMappingException($"Unable to generate the instantiation expression for the constructor {Ctor}: no expression could be mapped for constructor parameter '{map.Parameter}'.", null, TypeMap.Types); return result; }); @@ -55,4 +55,4 @@ public void AddParameter(ParameterInfo parameter, MemberInfo[] resolvers, bool c _ctorParams.Add(new ConstructorParameterMap(parameter, resolvers, canResolve)); } } -} \ No newline at end of file +}