System.MissingMethodException单元测试

时间:2017-05-09 15:29:28

标签: .net-core mstest visual-studio-2017 xunit .net-4.7

Visual Studio 2017 Test Runner中的项目引用似乎存在运行时问题。单元测试 CSPROJ TargetFramework=net47一起构建得很好,但在执行时我们从MSTEST或XUNIT获得以下消息。使用Microsoft.NET.Test.Sdk v15.0.0。

测试执行错误(x86):Serilog Seq Extension

  

System.MissingMethodException:找不到方法:&#39; Serilog.LoggerConfiguration Serilog.SeqLoggerConfigurationExtensions.Seq(Serilog.Configuration.LoggerSinkConfiguration,System.String,Serilog.Events.LogEventLevel,Int32,System.Nullable 1<System.TimeSpan>, System.String, System.String, System.Nullable 1,System.Nullable 1<Int64>, Serilog.Core.LoggingLevelSwitch, System.Net.Http.HttpMessageHandler, System.Nullable 1,布尔,Int32)&#39;。

单元测试示例 - Serilog

[Fact]
public void TestMethod1()
{
    LoggerConfiguration loggerConfig = new LoggerConfiguration();    
    loggerConfig.MinimumLevel.Debug();                    
    loggerConfig.WriteTo.LiterateConsole();    
    loggerConfig.WriteTo.Seq("http://localhost:65454");    
}

如果我们引用net462项目,我们会得到相同的结果,因此我们认为它与VS 2017相关,而不是.NET Framework版本。我们从来没有在VS 2015中看到过这个错误。好像加载带有可选参数/匹配签名等的DLL扩展有一个问题。该方法显然存在或者它不会编译 - 为什么在运行时这会崩溃?< / p>

如果我只使用本地nuget包它可以正常工作 - 在.NET Core CSPROJ中通过ProjectReference引用任何项目时,这似乎只是一个问题。它似乎没有正确处理依赖树。

使用KeyVault的另一个示例,其中VS Test Runner无法正确找到扩展方法...

测试执行错误(x86):KeyVault Extension

  

消息:System.MissingMethodException:找不到方法:&#39; Void Microsoft.Azure.KeyVault.KeyVaultClient..ctor(AuthenticationCallback,System.Net.Http.DelegatingHandler [])&#39;。

单元测试示例 - KeyVault

[Fact]
public void TestMethod1()
{
    KeyVaultClient _kvClient = new KeyVaultClient(new AuthenticationCallback(getKeyVaultToken));
}

private static async Task<string> getKeyVaultToken(string authority, string resource, string scope)
{
    var authContext = new AuthenticationContext(authority);
    ClientCredential clientCred = new ClientCredential("test", "account");
    AuthenticationResult result = authContext.AcquireTokenAsync(resource, clientCred).Result;

    if (result == null)
        throw new InvalidOperationException("Failed to obtain the JWT token");

    return result.AccessToken;
}

2 个答案:

答案 0 :(得分:10)

发现dotnet test这个奇怪的问题是双重的。在运行dotnet test --diag并查看输出后,它让我意识到有newer releases of Microsoft.NET.Test.Sdk哪个版本15.0.0掩盖了真正的问题。将nuget升级到15.3.0-preview-20170502-03后,会出现另一个异常。

错误来源:Microsoft.Rest.ClientRuntime

  

System.TypeLoadException:&#39;继承安全规则违反了类型:&#39; System.Net.Http.WebRequestHandler&#39;。派生类型必须与基本类型的安全可访问性匹配,或者不太容易访问。&#39;

现在这很有趣 - MissingMethodException掩盖了埋藏在System.Net.Http中的真正问题。第二个实现是base library has a bug which prevents the type from being loaded。一旦我nuget updated System.Net.Http to version 4.3.1,问题就消失了,我的项目参考文献又开始工作了。

结论

更新Microsoft.NET.Test.SDK to latest previewSystem.Net.Http to latest version以通过 dotnet测试来超越奇怪的MissingMethodException。你可以track the open issue on github here

选项#2 - 排除包参考资产

对于最新的VS 2017 CSPROJ格式 - 以下配置也修复此问题,因为它会将System.Net.Http复制到构建输出路径,默认情况下会加载GAC&#39; d版4.0.0.0

<PackageReference Include="System.Net.Http" Version="4.3.1">
  <ExcludeAssets>All</ExcludeAssets>
</PackageReference>

选项#3 - 装配绑定重定向

dotnet核心将跟随您放置在app.config中的任何运行时绑定重定向,因此您必须System.Net.Http到版本4.1.*的任何nuget依赖关系,您可以重定向到最新版本或恢复到上一个​​稳定版本4.0

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <!-- Another PackageReference dependency binds to 4.1.1 which is busted, we leverage .NET Core redirection and revert to CLR 4.0.0 -->
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="4.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

答案 1 :(得分:0)

我在测试一个项目中的类时遇到了这个问题).

解决方案就像升级测试项目中受影响的 Nuget 一样简单:

AutomationProperties.AutomationId="AnyID"