You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用XUnit的InlineData为MultipartFormDataContent传入多组测试数据

实现步骤
  • 第一步:将测试方法的[Fact]特性替换为[Theory],XUnit中只有Theory类型的测试才支持传入多组参数实现批量测试
  • 第二步:将测试逻辑中会随场景变化的变量抽成方法入参,通常包括测试文件路径、文件ContentType、预期响应状态码、预期错误提示这几个核心参数
  • 第三步:为每一个测试场景添加[InlineData]特性,按参数顺序传入对应场景的测试值即可
完整代码示例
// 可根据业务需要自行增删测试场景的参数配置
[Theory]
[InlineData(@"D:\Files\test.pdf", "application/pdf", HttpStatusCode.BadRequest, "Invalid file type.")]
[InlineData(@"D:\Files\test.exe", "application/vnd.microsoft.portable-executable", HttpStatusCode.BadRequest, "Invalid file type.")]
[InlineData(@"D:\Files\test.zip", "application/zip", HttpStatusCode.BadRequest, "Invalid file type.")]
// 如需添加正向测试场景直接新增InlineData即可
[InlineData(@"D:\Files\test.jpg", "image/jpeg", HttpStatusCode.OK, null)]
public async Task When_UploadFileWithDifferentTypes_Then_MatchExpectedResult(string filePath, string contentType, HttpStatusCode expectedStatusCode, string expectedErrorMessage)
{
    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);

                // Assert
                Assert.Equal(expectedStatusCode, response.StatusCode);
                if (!string.IsNullOrEmpty(expectedErrorMessage))
                {
                    var result = JsonConvert.DeserializeObject<ResponseMessage>(responseString);
                    Assert.Equal(expectedErrorMessage, result.file[0]);
                }
            }
        }
    }
}
注意事项
  • [InlineData]中传入的参数必须是编译期常量,如果你需要传入更复杂的测试数据(比如自定义类对象、动态生成的参数),可以替换为[MemberData]特性加载外部数据源
  • 测试文件建议不要写死本地绝对路径,可以改为项目相对路径或者嵌入资源,避免测试在其他设备运行时找不到文件
  • 可以根据自己的业务场景增减参数,比如需要测试不同Id参数的场景,也可以把Id值抽到参数列表里作为可变项

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:06:02