无法在单元测试

时间:2016-10-31 16:27:39

标签: c# unit-testing visual-studio-2015 json.net signalr

我正在尝试对依赖于Json.Net和SignalR的项目进行单元测试。出于某种原因,我无法运行许多这些单元测试。自从我将Json.Net更新到版本9.0.0后,我得到了一个例外情况:

  

mscorlib.dll中出现“System.IO.FileLoadException”类型的异常,但未在用户代码中处理

     

其他信息:无法加载文件或程序集“Newtonsoft.Json,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)

我可以使用干净的项目重现此行为。以下是重现的步骤:

  • 使用Visual Studio 2015 Update 3
  • 转到文件 - >新建 - >项目
  • 选择模板 - > Visual C# - >测试 - >单元测试项目
  • 右键单击项目,选择属性,然后将框架更改为 .NET Framework 4.6.1
  • 在名为 project.json
  • 的项目的根目录下创建一个新文件
  • project.json 的内容设置为以下内容:

{
  "dependencies": {
    "Microsoft.AspNet.SignalR.Client": "2.2.1",
    "Microsoft.AspNet.SignalR.Core": "2.2.1",
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "net451": {},
    "net461": {}
  },
  "runtimes": {
    "win": {},
    "win-x86": {},
    "win-x64": {}
  }
}
  • UnitTest1.cs (由脚手架提供)更改为以下内容:

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var conman = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager;
        }
    }
}
  • 关闭并重新打开visual studio(这是使用project.json加载依赖项所必需的)
  • 重建项目
  • 选择测试方法,然后按 CTRL + R + T

应该出现错误。

我不知道如何解决这个问题。我试过玩绑定bindingRedirects,没有任何东西让错误消失。重新安装包没有任何意义,因为我可以使用干净的项目重现它。

我担心的是我将不得不恢复到早期版本的Json.Net

3 个答案:

答案 0 :(得分:4)

所以,我得到了测试项目。由于我尝试了很多东西,我不完全确定具体是什么让它起作用,但我猜这是两件事的组合:

按照此处所述清除nuget缓存:How to clear NuGet package cache using command line?

  

首先,从here下载nuget命令行工具。

     

接下来,打开命令提示符并cd到下载nuget.exe的目录   ...
  您可以使用此命令清除所有缓存:
     nuget locals all -clear

从我使用packages.config范例而不是project.json的项目中复制bindingredirects。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

更新:我还有其他项目,包括UWP项目,在加载Newtonsoft.Json时也遇到问题。最后,我刚回到7.0,我的所有问题都有了解决之道。故事的道德:试图解决依赖是痛苦。

更新在其他项目中获得一些类似的经验似乎从VS中选择干净并不总是完全清理bin \ debug文件夹,并且手动删除该文件夹似乎有所帮助。

答案 1 :(得分:1)

有时,Newtonsoft.Json(无用)会在全局程序集缓存(GAC)中出现,它将胜过你要求的任何版本,除非它在本地目录中提供。检查测试项目的引用并找到对Newtonsoft.Json的引用:

  • 确保参考的复制本地值设置为 True
  • 确保引用指向解决方案的/ packages文件夹中的正确NuGet DLL,而不是其他位置。

答案 2 :(得分:0)

您的项目(单元测试项目和目标项目)中的程序集似乎存在差异。

之前我遇到过类似的问题,解决方案是将版本合并到一个库中。 您可以通过右键单击解决方案,然后“管理解决方案的NuGet包”来完成此操作。 这将允许您选择要用于解决方案下依赖于此库或任何其他库的项目的版本。