如何将DotNetOpenAuth程序集引用引入ASP.NET MVC4解决方案的单元测试项目?

时间:2012-11-14 06:52:39

标签: dll asp.net-mvc-4 nuget dotnetopenauth .net-assembly

Tl; dr版本:我遇到了异常: System.IO.FileLoadException:无法加载文件或程序集'DotNetOpenAuth.AspNet,版本4. 0 < /strong >.0.0 ...

有点沮丧的是,msft在新的MVC4项目模板中使用了很多静态类和auth方法。想要将所有成员资格/身份验证功能包装到实现接口的类中,以便我可以模拟单元测试。

经过几个晚上的努力,我决定从头开始,所以我删除了所有DotNetOpenAuth *程序集引用和nuget package.config引用。我已经删除了对Micrsoft.Aspnet.WebPages.OAuth.dll的所有引用。

重新安装软件包:我针对解决方案中需要dll引用的三个项目运行 install-package dotnetopenauth.aspnet

解决方案无法构建,因为我的包装器有一个包装的方法:Microsoft.AspNet.WebPages.OAuth(.dll).OAuthWebSecurity.RegisteredClientData因此我需要对这个assy的引用,所以我运行 install-针对相同的三个项目打包microsoft.aspnet.webpages.oauth

解决方案构建,但是当我运行引用Microsoft.AspNet.WebPages.OAuth(.dll).OAuthWebSecurity.RegisteredClientData的单元测试时,我收到运行时异常: System.IO.FileLoadException:无法加载文件或程序集'DotNetOpenAuth.AspNet,第4版。 0 .0.0 ......

所有三个项目中对此程序集的引用引用4. 1 .0.0,我的web.config中的DotNetOpenAuth.AspNet assemblyIdentity也是如此。

我正在使用resharper来运行测试,测试是nunit风格。

最后这里是我在fuslogvw中看到的粘贴。显然有些东西正在寻找4. 0 .0.0但是我无法弄清楚该做什么或怎么做(我有几次删除了这个转储中引用的临时数据文件夹): / p>

** * ** 装配活页夹日志条目(11/13/2012 @ 10:04:54 PM) ** * ** * ** * ** *

操作失败。 绑定结果:hr = 0x80131040。没有可用的描述。

装配管理器从以下位置加载:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll 在可执行文件C:\ Program Files(x86)\ JetBrains \ ReSharper \ v7.0 \ Bin \ JetBrains.ReSharper.TaskRunner.CLR4.MSIL.exe下运行 ---详细的错误日志如下。

===预绑定状态信息=== 日志:用户= i7 \ dave 日志:DisplayName = DotNetOpenAuth.AspNet,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 2780ccd10d57b246  (完全指定的) 日志:Appbase = file:/// C:/SVN/trunk/SoAndSo45/SoAndSo.Com.Tests.Unit/bin/Debug 日志:初始PrivatePath = NULL 日志:动态Base = NULL 日志:缓存基数= C:\ Users \ dave \ AppData \ Local \ Temp \ kpsvgxtp.io4 日志:AppName = SoAndSo.Com.Tests.Unit

调用程序集:SoAndSo.Com.Tests.Unit,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null。

日志:此绑定在默认加载上下文中启动。 日志:找不到应用程序配置文件。 日志:使用主机配置文件: 日志:使用C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config中的计算机配置文件。 日志:政策后参考:DotNetOpenAuth.AspNet,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 2780ccd10d57b246 日志:GAC Lookup未成功。 日志:尝试下载新的URL文件:/// C:/SVN/trunk/SoAndSo45/SoAndSo.Com.Tests.Unit/bin/Debug/DotNetOpenAuth.AspNet.DLL。 日志:程序集下载成功。尝试设置文件:C:\ SVN \ trunk \ SoAndSo45 \ SoAndSo.Com.Tests.Unit \ bin \ Debug \ DotNetOpenAuth.AspNet.dll 日志:进入下载缓存设置阶段。 日志:程序集名称为:DotNetOpenAuth.AspNet,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = 2780ccd10d57b246 警告:比较程序集名称导致不匹配:次要版本 错误:程序集引用与找到的程序集定义不匹配。 错误:安装失败,hr = 0x80131040。 错误:无法完成程序集的设置(hr = 0x80131040)。探测终止。

谢谢!

2 个答案:

答案 0 :(得分:5)

我认为你应该能够将这些作为NuGet包安装到你的单元测试项目中,如果你将这些绑定重定向包含到测试项目的app.config文件中,它们就可以工作了:

  <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
  </dependentAssembly>

如果您有一个新的MVC项目并在其上运行NuGet的Update-Package命令,则会自动创建这些命令。如果你没有运行它,并将NuGet包安装到你的单元测试项目中,那么你的单元测试项目将引用比你的web项目更新的程序集。我认为这会导致您看到的负载故障。您只需要确保所有程序集在您的解决方案中都有通用版本,或者所需的绑定重定向到位。事实上,我认为无论如何都需要绑定重定向,因为DotNetOpenAuth程序集最近更新的时间比Microsoft.AspNet.WebPages.OAuth程序包更新。

答案 1 :(得分:0)

得到了Msft的ASP.NET团队的PM的一些很好的帮助,他建议我复制/重用MVC4项目模板中包含的DLL集合,我已经完成了它并且它目前正在为我工​​作。

我将DLL直接复制到NuGet权限范围之外的“非托管”文件夹中,这样他们就不会无意中得到更新,除非我真的想要它们。

另外值得注意的是,我必须清理一些引用并将web.config中的转发转发到4.1.0.0,因为MVC4项目模板包含所有DotNetOpenAuth内容的4.0。*。