Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有FromForm绑定到IFormFile属性的C#集成测试控制器_C#_Asp.net Core_Multipartform Data - Fatal编程技术网

具有FromForm绑定到IFormFile属性的C#集成测试控制器

具有FromForm绑定到IFormFile属性的C#集成测试控制器,c#,asp.net-core,multipartform-data,C#,Asp.net Core,Multipartform Data,我正在使用: Visual Studio 2017专业版 dotnet核心sdk 2.2.102 XUnit 2.4.1 我想做的事 集成测试接受表单数据的API控制器方法 设置 控制器中使用[FromForm]属性接受CommandObject的API路由 CommandObject的一个属性类型为List,用于管理作为请求一部分的任何文件 当我从Postman手动测试控制器方法时,它会按预期工作 问题 文件未绑定到列表属性。其他一切都按预期工作,但文件不工作。这是我第一次使用多部分表

我正在使用:

  • Visual Studio 2017专业版
  • dotnet核心sdk 2.2.102
  • XUnit 2.4.1
我想做的事

集成测试接受表单数据的API控制器方法

设置

  • 控制器中使用
    [FromForm]
    属性接受CommandObject的API路由
  • CommandObject的一个属性类型为
    List
    ,用于管理作为请求一部分的任何文件
  • 当我从Postman手动测试控制器方法时,它会按预期工作
问题

文件未绑定到
列表
属性。其他一切都按预期工作,但文件不工作。这是我第一次使用多部分表单数据,所以我不确定该尝试什么

当我调试测试时,您可以看到除了
Documents
属性之外的所有功能都正常工作(注意,这与下面的代码不完全匹配,因为我必须混淆一些内容)

我看过的东西

与多部分表单数据相关的内容很多,我尝试过的一些解决方案有:

MyIntegrationTest.cs

我的集成测试的设置背后有很多代码。如果我把所有的东西都贴在这里,我想这不会有多大帮助。最重要的信息是变量
server
的类型为
Microsoft.AspNetCore.TestHost.TestServer

[事实]
异步任务Post_itemsync_HappyPath_ReturnsOKStatusCode()
{
var fileDir=@“C:/path/to/files”;
var fileNames=新字符串[]{“test.docx”,“test.txt”};
使用(var server=CreateTestServer())
{
//安排
var formData=new MultipartFormDataContent()
{
{新的StringContent(“测试标题”),“标题”},
{new StringContent(“测试说明”),“说明”},
{new StringContent(“String_1”),“AListOfStrings”},
{new StringContent(“String_2”),“AListOfStrings”},
{new StringContent(“3”),“NumberOfThings”}
};
foreach(文件名中的var文件名)
{
var document=File.ReadAllBytes($“{fileDir}/{fileName}”);
添加(新的ByteArrayContent(文档),“文件”,文件名);
}
string formDataBoundary=string.Format(“------------{0:N}”,Guid.NewGuid());
string contentType=“多部分/表单数据;边界=“+formDataBoundary;
var请求=新的HttpRequestMessage(HttpMethod.Post,“api/v1/item”)
{
标题=
{
{HttpRequestHeader.ContentType.ToString(),ContentType}
},
Content=formData
};
//表演
var response=wait server.CreateClient().sendsync(请求);
//断言
Assert.Equal(HttpStatusCode.OK,response.StatusCode);
//清理
...
}
}
MyController.cs

[HttpPost]
产品响应类型((int)HttpStatusCode.OK)]
[产品响应类型((int)HttpStatusCode.BadRequest)]
公共异步任务CreateItemAsync([FromForm]CreateItemCommand命令)
{
bool commandResult=false;
commandResult=wait\u mediator.Send(命令);
如果(!commandResult)
{
返回请求();
}
返回Ok();
}
CreateItemCommand.cs

[DataContract]
公共类CreateItemCommand
:IRequest
{
[数据成员]
公共字符串标题{get;set;}
[数据成员]
公共字符串说明{get;set;}
[数据成员]
公共哈希集{get;set;}
[数据成员]
public int NumberOfThings{get;set;}
[数据成员]
公共列表文档{get;private set;}
公共CreateITemCommand()
{
AListOfThings=newhashset();
}
公共CreateItemCommand(字符串标题、字符串描述、哈希集aListOfThings、int NumberOfThings、列表文档)
:此()
{
头衔=头衔;
描述=描述;
AlistOfstring=AlistOfstring;
NumberOfThings=NumberOfThings;
文件=文件;
}
}

初始化时,表单数据边界应添加到
MultipartFormDataContent
中,并且文件的名称需要与要填充的模型的所需属性匹配

//...

// Arrange
string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());

var formData = new MultipartFormDataContent(formDataBoundary) { //<---- NOTE HERE
    { new StringContent("Test Title"), "Title" },
    { new StringContent("Test Description"), "Description" },
    { new StringContent("String_1"), "AListOfStrings" },
    { new StringContent("String_2"), "AListOfStrings" },
    { new StringContent("3"), "NumberOfThings" }
};

foreach (var fileName in fileNames) {
    var document = File.ReadAllBytes($"{fileDir}/{fileName}");
    formData.Add(new ByteArrayContent(document), "Documents", fileName); //<-- NOTE HERE
}

// Act
var response = await server.CreateClient().PostAsync("api/v1/item", formData);

//...
/。。。
//安排
string formDataBoundary=string.Format(“------------{0:N}”,Guid.NewGuid());
var formData=新的MultipartFormDataContent(formDataBoundary){//