asp.net-web-api - 如何在使用集成测试测试数据库中的真实数据时解决“脆弱测试”问题
问题描述
作为 QA 世界的新手,我发现了一些问题,需要帮助。基本上,我的任务是使用 get/post/delete 方法测试 API 控制器并查看它是否“正常工作”。
这是我正在编写测试的代码的一部分:
[Authorize(Roles = "Admin")]
[HttpDelete("{id}")]
public IActionResult DeleteCategory(Guid id)
{
var result = _categoryDataService.DeleteCategory(id);
if (result.Status == Enums.Status.NoContent)
{
return BadRequest(result);
}
if (result.Status == Enums.Status.Error)
{
return StatusCode(500, result);
}
return Ok(result);
}
由于我正在针对真实数据库(Microsoft SQL Server MS)测试 API,我决定测试这些东西的最佳方法是使用 XUnit 进行集成测试。
当我试图删除一些用外键相互连接的记录时,我的痛苦就来了。这是我的测试
[Fact]
[Trait("CategoriesController", "DeleteCategory - Success")]
public async Task DeleteCategory_WithCorrectId_ReturnsSuccessStatusCode()
{
// Arrange
var client = _instance
.AuthenticatedInstance(new Claim(ClaimTypes.Role, "Admin"))
.CreateClient();
// Act
var result = await client.GetAsync("GetAllCategories");
var jsonFromGetResponse = await result.Content.ReadAsStringAsync();
var singleResponse = JsonConvert.DeserializeObject<List<Infrastructure.Context.Category>>(jsonFromGetResponse);
var h = singleResponse.FirstOrDefault();
var deleteResponse = await client.DeleteAsync("" + $"DeleteCategory/{h.Id}");
var jsonFromDeleteResponse = await deleteResponse.Content.ReadAsStringAsync();
var singleDeleteResponse = JsonConvert.DeserializeObject<Response<NoValue>>(jsonFromDeleteResponse);
// Assert
if (singleDeleteResponse.Message.Equals("Category is used"))
{
deleteResponse.StatusCode.Should().Be(HttpStatusCode.Forbidden);
}
else
{
deleteResponse.StatusCode.Should().Be(HttpStatusCode.OK);
}
}
我 99% 确信这不是编写这样的测试的正确方法。最后我的问题是,我如何编写两个单独的测试,首先 - 当我使用外键到达数据记录时(应该获得禁止状态),其次 - 当找到“未连接”数据记录时(应该获得成功状态代码)?或者也许完全有另一种方式来测试这样的控制器?谢谢你的回答!
解决方案
推荐阅读
- java - 当我尝试加载 FXML 文件时,出现 java.io.IOException 错误
- material-ui - 如何在自己的 Material-UI 项目中拥有默认的 MuiTheme 文件
- c++ - 验证我对 CMakeLists.txt 文件的理解
- javascript - 在使用 javascript 的不同页面上时,如何在单独的 header.html 中更改活动导航 li?
- reactjs - 在 useEffect 清理函数中取消所有订阅和异步任务
- javascript - 如何在此输入中仅输入数字和减号
- java - 有没有办法继续重复数组列表。像 arraylist 有 12,但它会在使用相同的列表时继续计数
- swift - 如何为形状添加自定义视图修改器
- vue.js - 当键以前不存在时改变 vue 中的值不会更新视图
- javascript - pouchdb 使用 couchDB 进行有限复制