c# – Unittest项目Azure Functions无法加载文件或程序集’Newtonsoft.Json’
作者:互联网
我为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,net,unit-testing,azure,azure-functions 来源: https://codeday.me/bug/20190627/1305696.html