Visual Studio 2017 Test Runner中的项目引用似乎存在运行时问题。单元测试 CSPROJ 与TargetFramework=net47
一起构建得很好,但在执行时我们从MSTEST或XUNIT获得以下消息。使用Microsoft.NET.Test.Sdk
v15.0.0。
System.MissingMethodException:找不到方法:' 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.Nullable1<Int64>, Serilog.Core.LoggingLevelSwitch, System.Net.Http.HttpMessageHandler, System.Nullable
1,布尔,Int32)&#39;。
[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无法正确找到扩展方法...
消息:System.MissingMethodException:找不到方法:&#39; Void Microsoft.Azure.KeyVault.KeyVaultClient..ctor(AuthenticationCallback,System.Net.Http.DelegatingHandler [])&#39;。
[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;
}
答案 0 :(得分:10)
发现dotnet test
这个奇怪的问题是双重的。在运行dotnet test --diag
并查看输出后,它让我意识到有newer releases of Microsoft.NET.Test.Sdk
哪个版本15.0.0
掩盖了真正的问题。将nuget升级到15.3.0-preview-20170502-03
后,会出现另一个异常。
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 preview和System.Net.Http
to latest version以通过 dotnet测试来超越奇怪的MissingMethodException
。你可以track the open issue on github here。
对于最新的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>
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"