Appveyor,测试引用了错误的程序集版本
Appveyor, test reference the wrong assembly version
Appveyor 平台的新手,所以这可能只是我的天真。我将我的项目设置为从我的 GitHub 存储库构建。这似乎有效,除了测试。代码主要是 .Net 4.0,因为它支持遗留项目——我目前无法将它移动到更高版本的框架。因为这个项目已经在使用 Newtonsoft.Json,所以我不得不使用一个特定的版本。所有代码和测试 运行 本地。但是,一旦我设置了 CI(并开始着手进行 Nuget 恢复),我的测试仍然完全失败。他们没有做任何引人注目的事情。错误非常简单——Nuget 正在引入版本 6.0.8,但测试的构建过程希望根据输出引用 8.0.0.0:
Discovering tests...OK vstest.console /logger:Appveyor
"C:\projects\debuginterface\Ratcow.Debugging.Server.Tests\bin\Debug\Ratcow.Debugging.Server.Tests.dll"
Microsoft (R) Test Execution Command Line Tool Version 15.0.26228.0
Copyright (c) Microsoft Corporation. All rights reserved. Starting
test execution, please wait... Failed BasicTest_ValueTypes Error
Message: Test method
Ratcow.Debugging.Server.Tests.MainUnitTest.BasicTest_ValueTypes threw
exception: System.IO.FileLoadException: Could not load file or
assembly 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral,
PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The
located assembly's manifest definition does not match the assembly
reference. (Exception from HRESULT: 0x80131040) --->
System.IO.FileLoadException: Could not load file or assembly
'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral,
PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The
located assembly's manifest definition does not match the assembly
reference. (Exception from HRESULT: 0x80131040) Stack Trace:
at Ratcow.Debugging.Server.DebugInterface.InstanceAsString(Object value) at
Ratcow.Debugging.Server.DebugInterface.GetVariableValue(String
variableName) in
C:\projects\debuginterface\Ratcow.Debugging.Server\DebugInterface.cs:line
104 at
Ratcow.Debugging.Server.Tests.MainUnitTest.BasicTest_ValueTypes() in
C:\projects\debuginterface\Ratcow.Debugging.Server.Tests\MainUnitTest.cs:line
35
我可以接受这可能是正确的 - 除了代码引用 6.0.8,packages.config :
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MSTest.TestAdapter" version="1.1.11" targetFramework="net452" />
<package id="MSTest.TestFramework" version="1.1.11" targetFramework="net452" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net40" />
</packages>
有什么想法吗?最后一次启用测试的失败构建是 here。它正在愉快地构建,并且正在 运行 在多台台式机和笔记本电脑上的 VS2017 上进行测试。
好吧,感谢 Jeroen 上面的提示(我本来打算试试这个,但我没有时间在发布这个问题之前),答案有两个:
- 这不是特定于 Appveyor 的。如果我 运行 vstest.console.exe 直接在编译的测试项目上,我的测试也会因为完全相同的原因而失败。这是我解决问题的重要部分,重新创建问题始终是解决问题的最大部分。
如建议的那样,添加 dependentAssembly 声明确实有效。这是我为测试项目添加到 App.config 的内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json"
<publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="8.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</configuration>
测试现在 运行 在命令行上进行,并且刚刚将代码提交给 GitHub,看起来 Appveyor 也构建了并且 运行 也进行了测试。
Appveyor 平台的新手,所以这可能只是我的天真。我将我的项目设置为从我的 GitHub 存储库构建。这似乎有效,除了测试。代码主要是 .Net 4.0,因为它支持遗留项目——我目前无法将它移动到更高版本的框架。因为这个项目已经在使用 Newtonsoft.Json,所以我不得不使用一个特定的版本。所有代码和测试 运行 本地。但是,一旦我设置了 CI(并开始着手进行 Nuget 恢复),我的测试仍然完全失败。他们没有做任何引人注目的事情。错误非常简单——Nuget 正在引入版本 6.0.8,但测试的构建过程希望根据输出引用 8.0.0.0:
Discovering tests...OK vstest.console /logger:Appveyor "C:\projects\debuginterface\Ratcow.Debugging.Server.Tests\bin\Debug\Ratcow.Debugging.Server.Tests.dll" Microsoft (R) Test Execution Command Line Tool Version 15.0.26228.0 Copyright (c) Microsoft Corporation. All rights reserved. Starting test execution, please wait... Failed BasicTest_ValueTypes Error Message: Test method Ratcow.Debugging.Server.Tests.MainUnitTest.BasicTest_ValueTypes threw exception: System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) ---> System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) Stack Trace: at Ratcow.Debugging.Server.DebugInterface.InstanceAsString(Object value) at Ratcow.Debugging.Server.DebugInterface.GetVariableValue(String variableName) in C:\projects\debuginterface\Ratcow.Debugging.Server\DebugInterface.cs:line 104 at Ratcow.Debugging.Server.Tests.MainUnitTest.BasicTest_ValueTypes() in C:\projects\debuginterface\Ratcow.Debugging.Server.Tests\MainUnitTest.cs:line 35
我可以接受这可能是正确的 - 除了代码引用 6.0.8,packages.config :
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MSTest.TestAdapter" version="1.1.11" targetFramework="net452" />
<package id="MSTest.TestFramework" version="1.1.11" targetFramework="net452" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net40" />
</packages>
有什么想法吗?最后一次启用测试的失败构建是 here。它正在愉快地构建,并且正在 运行 在多台台式机和笔记本电脑上的 VS2017 上进行测试。
好吧,感谢 Jeroen 上面的提示(我本来打算试试这个,但我没有时间在发布这个问题之前),答案有两个:
- 这不是特定于 Appveyor 的。如果我 运行 vstest.console.exe 直接在编译的测试项目上,我的测试也会因为完全相同的原因而失败。这是我解决问题的重要部分,重新创建问题始终是解决问题的最大部分。
如建议的那样,添加 dependentAssembly 声明确实有效。这是我为测试项目添加到 App.config 的内容:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" <publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="8.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> </configuration>
测试现在 运行 在命令行上进行,并且刚刚将代码提交给 GitHub,看起来 Appveyor 也构建了并且 运行 也进行了测试。