c# – Unittest项目Azure Functions无法加载文件或程序集’Newtonsoft.Json’
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Unittest项目Azure Functions无法加载文件或程序集’Newtonsoft.Json’,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4787字,纯文字阅读大概需要7分钟。
内容图文
![c# – Unittest项目Azure Functions无法加载文件或程序集’Newtonsoft.Json’](/upload/InfoBanner/zyjiaocheng/789/bbdb8976e36d4b2794bb1a099455bcd7.jpg)
我为here提到了一个功能应用程序的测试项目.Http触发了我编写的Azure功能,使用依赖注入(AzureFunctions.AutoFac),如下所示:
[DependencyInjectionConfig(typeof(DependencyConfig))]
public static class CreateDeclarationsFunction
{
[FunctionName("CreateDeclarationsFunction")]
public static HttpResponseMessage Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "CreateDeclarations")]HttpRequestMessage req,
TraceWriter log,
[Inject]IDeclarationDataService declarationDataService,
[Inject]IClientDataService clientDataService)
{
log.Info("Http triggered function: CreateDeclarationsFunction processed a request.");
try
{
var clients = clientDataService.GetAll().ToList();
foreach (var client in clients)
{
// Create and save new declaration for each client
declarationDataService.CreateAndSaveNew(client.Id);
}
}
catch (Exception ex)
{
return req.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
}
return req.CreateResponse(HttpStatusCode.OK);
}
}
和unittest类(与Moq,Shouldly和NBuilder):
[TestClass]
public class CreateDeclarationsFunctionTest
{
private Mock<IDeclarationDataService> _declarationDataService;
private Mock<IClientDataService> _clientDataService;
[TestInitialize]
public void Initialize()
{
_declarationDataService = new Mock<IDeclarationDataService>();
_clientDataService = new Mock<IClientDataService>();
}
[TestMethod]
public void CreateDeclarations_ReturnsOk()
{
// Arrange
var clients = Builder<Client>.CreateListOfSize(10).Build();
_declarationDataService.Setup(x => x.CreateAndSaveNew(It.IsAny<int>()))
.Returns(Builder<Declaration>.CreateNew().Build);
// Act > Exception by calling the Run method
var result = CreateDeclarationsFunction.Run(CreateRequest(""), new TraceWriterStub(TraceLevel.Info),
_declarationDataService.Object, _clientDataService.Object);
// Assert
// TODO
}
private static HttpRequestMessage CreateRequest(string json)
{
// Just a mocked request
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://localhost"),
Content = new StringContent(json, Encoding.UTF8, "application/json")
};
return request;
}
}
当我运行这个单元测试时,它给出了一个例外.
Result StackTrace:
at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter..ctor()
at System.Net.Http.Formatting.JsonMediaTypeFormatter..ctor()
at System.Net.Http.Formatting.MediaTypeFormatterCollection.CreateDefaultFormatters()
at System.Web.Http.HttpConfiguration.DefaultFormatters(HttpConfiguration config)
at System.Web.Http.HttpConfiguration..ctor(HttpRouteCollection routes)
at System.Net.Http.HttpRequestMessageExtensions.CreateErrorResponse(HttpRequestMessage request, HttpStatusCode statusCode, Func`2 errorCreator)
at System.Net.Http.HttpRequestMessageExtensions.CreateErrorResponse(HttpRequestMessage request, HttpStatusCode statusCode, Exception exception)
at FunctionApp.CreateDeclarationsFunction.Run(HttpRequestMessage req, TraceWriter log, IDeclarationDataService declarationDataService, IClientDataService clientDataService)
at FunctionApp.Tests.CreateDeclarationsFunctionTest.CreateDeclarations_ReturnsOk() in C:\TFS\...\FunctionApp.Tests\CreateDeclarationsFunctionTest.cs:line 63
Result Message:
Test method FunctionApp.Tests.CreateDeclarationsFunctionTest.CreateDeclarations_ReturnsOk threw exception:
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)
FunctionApp有两个嵌套引用Newtonsoft.Json(9.0.1),但没有引用到6.0.0.0版本.
依赖性> Nuget> Microsoft.NET“.Sdk.Functions(1.0.6)> Newtonsoft.Json(9.0.1)
依赖性> Nuget> AzureFunctions.Autofac(2.0.0)> Microsoft.Azure.Webjobs(2.1.0-beta4)> Newtonsoft.Json(9.0.1)
测试项目引用了FunctionApp项目.该异常仅在单元测试时显示,而不在其运行时显示(并从浏览器调用).
有没有人有上层例外的解决方案?谢谢.
UPDATE
我发现返回req.CreateErrorResponse(HttpStatusCode.InternalServerError,ex)时会发生System.IO.FileLoadException;
返回req.CreateResponse(HttpStatusCode.OK)时;相反,它没有给出上述例外.
解决方法:
我认为,由于我设置测试项目的方式(最初是.NET标准,然后手动将目标框架转换为.NET Framework 4.6.1,如here所述),测试项目中不会生成app.config文件.此外,我认为在解决方案中部分更新nuget软件包的版本时,这样的测试项目设置不会自动为nuget软件包生成绑定重定向.
正如@FabioCavalcante所述,我手动必须将app.config文件添加到测试项目中,并为Newtonsoft.Json添加绑定重定向.
<?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>
内容总结
以上是互联网集市为您收集整理的c# – Unittest项目Azure Functions无法加载文件或程序集’Newtonsoft.Json’全部内容,希望文章能够帮你解决c# – Unittest项目Azure Functions无法加载文件或程序集’Newtonsoft.Json’所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。