错误单元测试web api控制器

时间:2014-03-04 06:35:41

标签: c# asp.net unit-testing asp.net-web-api json.net

我正在使用AspNet Web Api Client 5.0,我正在尝试对web api控制器进行单元测试。

var encservice = new EncryptionService();
var acctservice = FakeServices.GetAccountService();
var controller = new AccountController(acctservice, encservice);
controller.Request = new HttpRequestMessage();

当代码

controller.Request.SetConfiguration(new HttpConfiguration());

执行我遇到异常

  

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

     

来源: System.Net.Http.Formatting

     

Stacktrace :在System.Net.Http.Formatting.JsonMediaTypeFormatter..ctor()      在System.Net.Http.Formatting.MediaTypeFormatterCollection.CreateDefaultFormatters()      在System.Net.Http.Formatting.MediaTypeFormatterCollection..ctor()      在System.Web.Http.HttpConfiguration.DefaultFormatters()      在System.Web.Http.HttpConfiguration..ctor(HttpRouteCollection路由)      在System.Web.Http.HttpConfiguration..ctor()      at EMR.Test.Controller.AccountControllerTest.Should_Get()in c:\ PremiumProjectsCollection \ emr \ src \ EMRAzure \ EMRAzure \ EMR.Test \ Controller \ AccountControllerTest.cs:line 34

我使用的newsoft.json的版本是6.0

我的配置文件中还有一个程序集重定向

 <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>

我使用的测试运行器是 MStest,VS2012

4 个答案:

答案 0 :(得分:5)

您需要添加assembly redirect

<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-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

(假设 Newtonsoft.Json 的汇编版本完全 6.0.0.0 。)

答案 1 :(得分:3)

(注意下面的注释是指具有此问题的Web Api客户端项目)

我遇到了与Newtonsoft.Json版本相同的问题,所以我删除了旧版本的引用,并使用了Package Manager Console在我的Web Api Client Library和Test Project上安装了最新版本的Newtonsoft.Json。

Install-Package Newtonsoft.Json -Version 6.0.8 (注意你可能需要找出哪个是最新版本)

问题仍然存在,所以我意识到System.Net.Http.Formatting与我最新版本的Json之间存在崩溃。 要解决此问题,请删除System.Net.Http和System.Net.Http.Formatting引用,并通过Nuget安装WebApi客户端库,如下所示:

安装包Microsoft.AspNet.WebApi.Client

这为我解决了。

答案 2 :(得分:1)

我自己没有尝试过,但2012年的mstest似乎有一个错误。你必须使用.testsettings文件来获取app.config。

请参阅以下链接:http://social.msdn.microsoft.com/Forums/vstudio/en-US/234926d1-42c0-4ebb-af39-1626e72f6c39/why-does-assemblybinding-work-only-if-testsettings-file-is-used-vs2012rc?forum=vsunittest

答案 3 :(得分:0)

我几天前遇到了同样的问题,我花了几个小时才找到解决方案。

我正在测试一个安装了最新版NewtonSoft的单元,而我的测试项目有旧版本。

我所做的是通过&#34;管理Nuget软件包解决方案来整合我的解决方案中的这个库的版本&#34;右键单击解决方案资源管理器中的解决方案选项。

这将更新当前解决方案下项目中存在的所有NewtonSoft库,并从VisualStudio在解决方案目录中名为packages的文件夹中创建的包控件中删除所有旧版本。