如何找到NotSupportedException的根本原因?

时间:2019-11-22 09:45:47

标签: c# .net-core .net-core-3.0

我有一个针对.net 4.6.1项目的netcoreapp2.0测试项目。安装3.0 SDK之后,我已经开始在此项目的所有测试中引发NotSupportedException。在只有旧版SDK或在global.json文件上指定2.2 SDK的计算机上,它可以正常工作。

我的意思是,如何找到引发异常的原因?它被扔到我不拥有的DLL中,并且无法使用sourcelink。 VS不会显示任何堆栈跟踪,并且即使为每个异常都设置了CLR异常,它也不会在异常上停止。

这是我通过运行测试得到的唯一结果。

PS (...)> dotnet test
Test run for (...).Tests.dll(.NETCoreApp,Version=v2.2)
Microsoft (R) Test Execution Command Line Tool Version 16.3.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...

A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:01.35]     (...) [FAIL]
  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

[xUnit.net 00:00:01.43]     (...) [FAIL]
[xUnit.net 00:00:01.43]     (...) [FAIL]
[xUnit.net 00:00:01.43]     (...) [FAIL]
[xUnit.net 00:00:01.43]     (...) [FAIL]
[xUnit.net 00:00:01.43]     (...) [FAIL]
[xUnit.net 00:00:01.43]     (...) [FAIL]
[xUnit.net 00:00:01.43]     (...) [FAIL]
[xUnit.net 00:00:01.43]     (...) [FAIL]
  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

  X (...) [1ms]
  Error Message:
   System.NotSupportedException : Specified method is not supported.

(REPEATS FOR ALL THE TESTS...)

Test Run Failed.
Total tests: 30
     Failed: 30
 Total time: 3,2953 Seconds

更新: 我不知道在将VS更新到16.3.9(我在16.3.8上)和/或重新启动计算机后,如何或为什么不再发生这种情况。现在所有测试都可以正常进行,而无需对源代码进行任何修改。

git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
Test run for (...).Tests.dll(.NETCoreApp,Version=v2.0)
Microsoft (R) Test Execution Command Line Tool Version 16.3.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...

A total of 1 test files matched the specified pattern.

Test Run Successful.
Total tests: 431
     Passed: 431
 Total time: 10,5425 Seconds

尽管我无法在完全相同的情况下重现该错误,但我可以故意得到相同的错误消息,并且可能是相关的。 我们所有的测试都用Xunit.TheoryAttribute,几个Xunit.TraitAttribute和许多JsonDataSourceAttribute装饰。最后一个是在内部开发的,并根据JSON文件创建了一个测试场景,就像DataSourceAttribute所做的一样(如How to: Create a data-driven unit test所述)。 甚至激活“抛出时中断”并在测试方法和构造函数上添加断点,当找不到测试方案文件时,我也会收到相同的错误消息,并且没有提供stacktrace。

TestClassName
   Source: (...)Test.cs line 35
   Duration: 1 ms

  Message: 
    System.NotSupportedException : Specified method is not supported.

也许先前的问题与文件未复制到输出有关,但我仍然不知道为什么我没有获得堆栈跟踪信息或与找不到文件相关的更具体的错误。我将检查属性源,并验证是否可以改进属性以及是否以某种方式隐藏了问题。

1 个答案:

答案 0 :(得分:1)

通过将JsonDataSourceAttribute源添加到相同的解决方案中,我可以使其停止在应有的位置(在这种情况下,位于“找不到文件”上)。

这是原始来源。 if (!File.Exists(inputfile))引发了异常(当被强制发生时),但是Xunit.Sdk.DataAttribute隐藏了该异常。

    public sealed class JsonDataSourceAttribute : DataAttribute
    {
        public string InputFilePath { get; }

        /// <summary>
        /// Retrieves a collection of context data
        /// </summary>
        /// <param name="inputFilePath">Json source file path</param>
        public JsonDataSourceAttribute(string inputFilePath)
        {
            this.InputFilePath = inputFilePath;
        }

        public override IEnumerable<object[]> GetData(MethodInfo testMethod)
        {
            if (testMethod == null) { throw new ArgumentNullException(nameof(testMethod)); }

            var inputfile = Path.IsPathRooted(this.InputFilePath)
                ? this.InputFilePath
                : Path.Combine(Directory.GetCurrentDirectory(), this.InputFilePath);

            if (!File.Exists(inputfile))
            {
                throw new ArgumentException($"Input file not found at '{inputfile}'.");
            }

            return this.LoadFileData(inputfile, this.EnumMap);
        }

        (...)
    }

通过将文件存在性检查移到构造函数中,我可以得到想要的东西。

        public JsonDataSourceAttribute(string inputFilePath)
        {
            var inputfile = Path.IsPathRooted(inputFilePath)
                ? inputFilePath
                : Path.Combine(Directory.GetCurrentDirectory(), inputFilePath);

            if (!File.Exists(inputfile))
            {
                throw new ArgumentException($"Input file not found at '{inputfile}'.");
            }

            this.InputFilePath = inputfile;
        }

这不是“找到根本原因”的答案,但我想这是不可能的,因为在Xunit.Sdk.DataAttribute上省略了原始异常。