Version 2.4.x System.ArgumentNullException parsing options in unit-test
Hello,
i tried all 2.4.x versions (2.4.0, 2.4.1, 2.4.2, 2.4.3) and all have the same exception. In my unit-test i call my program only with "--help" after that, i receive the following stacktrace:
// Stacktrace
System.ArgumentNullException
Value cannot be null.
Parameter name: element
at System.Attribute.GetCustomAttributes(Assembly element, Type attributeType, Boolean inherit)
at System.Reflection.CustomAttributeExtensions.GetCustomAttributes[T](Assembly element)
at CommandLine.Infrastructure.ReflectionHelper.GetAttribute[TAttribute]()
at CommandLine.Text.HelpText.AutoBuild[T](ParserResult`1 parserResult, Func`2 onError, Func`2 onExample, Boolean verbsIndex, Int32 maxDisplayWidth)
at CommandLine.Text.HelpText.AutoBuild[T](ParserResult`1 parserResult, Int32 maxDisplayWidth)
at CommandLine.Parser.<>c__DisplayClass17_0`1.<DisplayHelp>b__1(IEnumerable`1 _, TextWriter writer)
at CSharpx.MaybeExtensions.Do[T1,T2](Maybe`1 maybe, Action`2 action)
at CommandLine.ParserResultExtensions.WithNotParsed[T](ParserResult`1 result, Action`1 action)
at CommandLine.Parser.DisplayHelp[T](ParserResult`1 parserResult, TextWriter helpWriter, Int32 maxDisplayWidth)
at Program.<Main>d__5.MoveNext() in C:\..\..\Program.cs:line 33
My code snippets are the following ones:
// Test method (xUnit) which fails [Fact] public async Task CallMain_GiveHelpArgument_ExpectSuccess() { var result = await Program.Main(new[] { "--help" }); Assert.Equal(ERROR_SUCCESS, result); }
// main program internal class Program { private const int ERROR_SUCCESS = 0; internal static async Task<int> Main(string[] args) { bool hasError = false; bool helpOrVersionRequested = false; ParserResult<Options> parsedOptions = Parser.Default.ParseArguments<Options>(args).WithNotParsed(errors => { helpOrVersionRequested = errors.Any(x => x.Tag == ErrorType.HelpRequestedError || x.Tag == ErrorType.VersionRequestedError); hasError = true; }); if (helpOrVersionRequested) { return ERROR_SUCCESS; } // Execute as a normal call // ... } }
// Options internal class Options { [Option('c', "connectionString", Required = true, HelpText = Texts.ExplainConnection)] public string ConnectionString { get; set; } [Option('j', "jobId", Required = true, HelpText = Texts.ExplainJob)] public int JobId { get; set; } [Usage(ApplicationAlias = "Importer.exe")] public static IEnumerable<Example> Examples { get => new[] { new Example(Texts.ExplainExampleExecution, new Options() { ConnectionString="Server=MyServer;Database=MyDatabase", JobId = 5 }), }; } }
I did a downgrade to version 2.3.0 without any issues. Calling the compiled Program.exe by a command line seems to be working as well. I created that test to ensure my application stops when the version or help is requested only without any additional information.