diff --git a/src/Adapter/MSTest.TestAdapter/Extensions/MethodInfoExtensions.cs b/src/Adapter/MSTest.TestAdapter/Extensions/MethodInfoExtensions.cs index 91360fde29..453d05bcb2 100644 --- a/src/Adapter/MSTest.TestAdapter/Extensions/MethodInfoExtensions.cs +++ b/src/Adapter/MSTest.TestAdapter/Extensions/MethodInfoExtensions.cs @@ -162,10 +162,18 @@ internal static void InvokeAsSynchronousTask(this MethodInfo methodInfo, object? { int methodParametersLengthOrZero = methodParameters?.Length ?? 0; int argumentsLengthOrZero = arguments?.Length ?? 0; - if (methodParametersLengthOrZero != argumentsLengthOrZero) + +#if WINDOWS_UWP + // There is a bug with UWP in release mode where the arguments are wrapped in an object[], so we need to unwrap it. + // See https://github.com/microsoft/testfx/issues/3071 + if (argumentsLengthOrZero == 1 + && argumentsLengthOrZero < methodParametersLengthOrZero + && arguments![0] is object[] args) { - throw GetParameterCountMismatchException(methodInfo, arguments, methodParameters, methodParametersLengthOrZero, argumentsLengthOrZero, innerException: null); + arguments = args; + argumentsLengthOrZero = args.Length; } +#endif try { @@ -173,7 +181,17 @@ internal static void InvokeAsSynchronousTask(this MethodInfo methodInfo, object? } catch (Exception ex) when (ex is TargetParameterCountException or ArgumentException) { - throw GetParameterCountMismatchException(methodInfo, arguments, methodParameters, methodParametersLengthOrZero, argumentsLengthOrZero, ex); + throw new TestFailedException( + ObjectModel.UnitTestOutcome.Error, + string.Format( + CultureInfo.InvariantCulture, + Resource.CannotRunTestArgumentsMismatchError, + methodInfo.DeclaringType!.FullName, + methodInfo.Name, + methodParametersLengthOrZero, + string.Join(", ", methodParameters?.Select(p => p.ParameterType.Name) ?? Array.Empty()), + argumentsLengthOrZero, + string.Join(", ", arguments?.Select(a => a?.GetType().Name ?? "null") ?? Array.Empty())), ex); } } @@ -189,17 +207,4 @@ internal static void InvokeAsSynchronousTask(this MethodInfo methodInfo, object? } #endif } - - private static TestFailedException GetParameterCountMismatchException(MethodInfo methodInfo, object?[]? arguments, ParameterInfo[]? methodParameters, int methodParametersLengthOrZero, int argumentsLengthOrZero, Exception? innerException) => - new( - ObjectModel.UnitTestOutcome.Error, - string.Format( - CultureInfo.InvariantCulture, - Resource.CannotRunTestArgumentsMismatchError, - methodInfo.DeclaringType!.FullName, - methodInfo.Name, - methodParametersLengthOrZero, - string.Join(", ", methodParameters?.Select(p => p.ParameterType.Name) ?? Array.Empty()), - argumentsLengthOrZero, - string.Join(", ", arguments?.Select(a => a?.GetType().Name ?? "null") ?? Array.Empty())), innerException); }