c# - 如何使用 XUnit `InlineData` 以便为 MultipartFormDataContent 插入多个测试数据?
问题描述
我有这个工作的 Xunit 代码。
[Fact]
public async Task When_DocumentTypeInvalidFileType_Then_ShouldFail()
{
using (var client = new HttpClient())
{
var filePath = @"D:\Files\test.pdf";
using (var stream = File.OpenRead(filePath))
{
using (var form = new MultipartFormDataContent())
{
form.Add(new StringContent(Guid.NewGuid().ToString()), "Id");
var file = new StreamContent(stream);
file.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
form.Add(file, "File", Path.GetFileName(filePath));
// Act
var response = await client.PostAsync("/ABC/Document", form);
var responseString = await response.Content.ReadAsStringAsync();
_output.WriteLine("response: {0}", responseString);
HttpStatusCode statusCode = response.StatusCode;
Assert.Equal(HttpStatusCode.BadRequest, statusCode);
var result = JsonConvert.DeserializeObject<ResponseMessage>(responseString);
Assert.Equal("Invalid file type.", result.file[0]);
}
}
}
但以上仅测试一种情况。如何使用 XUnitInlineData
插入多个测试数据MultipartFormDataContent
?
解决方案
[Theory]
[InlineData(MediaTypeNames.Application.Pdf, @"D:\Files\test.pdf")]
[InlineData(MediaTypeNames.Application.Xml, @"D:\Files\test.xml")]
// else files what you need
public async Task When_DocumentTypeInvalidFileType_Then_ShouldFail(string contentType, string filePath)
{
using (var client = new HttpClient())
{
using (var stream = File.OpenRead(filePath))
{
using (var form = new MultipartFormDataContent())
{
form.Add(new StringContent(Guid.NewGuid().ToString()), "Id");
var file = new StreamContent(stream);
file.Headers.ContentType = new MediaTypeHeaderValue(contentType);
form.Add(file, "File", Path.GetFileName(filePath));
// Act
var response = await client.PostAsync("/ABC/Document", form);
var responseString = await response.Content.ReadAsStringAsync();
_output.WriteLine("response: {0}", responseString);
HttpStatusCode statusCode = response.StatusCode;
Assert.Equal(HttpStatusCode.BadRequest, statusCode);
var result = JsonConvert.DeserializeObject<ResponseMessage>(responseString);
Assert.Equal("Invalid file type.", result.file[0]);
}
}
}
}
或者
[Theory]
[MemberData(nameof(TestGenerator.GetTestData), MemberType = typeof(TestGenerator))]
public async Task When_DocumentTypeInvalidFileType_Then_ShouldFail(string contentType, string filePath)
{
using (var client = new HttpClient())
{
using (var stream = File.OpenRead(filePath))
{
using (var form = new MultipartFormDataContent())
{
form.Add(new StringContent(Guid.NewGuid().ToString()), "Id");
var file = new StreamContent(stream);
file.Headers.ContentType = new MediaTypeHeaderValue(contentType);
form.Add(file, "File", Path.GetFileName(filePath));
// Act
var response = await client.PostAsync("/ABC/Document", form);
var responseString = await response.Content.ReadAsStringAsync();
_output.WriteLine("response: {0}", responseString);
HttpStatusCode statusCode = response.StatusCode;
Assert.Equal(HttpStatusCode.BadRequest, statusCode);
var result = JsonConvert.DeserializeObject<ResponseMessage>(responseString);
Assert.Equal("Invalid file type.", result.file[0]);
}
}
}
}
class TestGenerator
{
public static IEnumerable<object[]> GetTestData() => new List<object[]>
{
new object[] { MediaTypeNames.Application.Pdf, @"D:\Files\test.pdf" },
new object[] { MediaTypeNames.Application.Xml, @"D:\Files\test.xml" }
};
}
推荐阅读
- jquery - 如何计算一个类别和作者的帖子数量
- reactjs - 检查下拉列表的值不在另一个下拉列表中。使用 YUP 的自定义验证
- sql - 如何为 Postgresql/sql 中的现有时间戳添加时间?
- python - 如何在python中的某个字符序列之后剪切
- spring-boot - 在哪里定义在环境变量中使用哪个键值
- python - 熊猫 to_datetime 绝对什么都不做
- spring - 在 Spring 框架中从 5.2.1 升级到 5.3.9 时无法自动装配 bean
- azure - 我需要比较 azure 数据工厂中两个查找活动的值并在查询中使用它们,但查询不正确
- javascript - Axios 不发布数组
- postgresql - Tableau 数据提取刷新不断失败