如何使用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
相关产品推荐
相关产品推荐

