首页 > 解决方案 > 如何在使用集成测试测试数据库中的真实数据时解决“脆弱测试”问题

问题描述

作为 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% 确信这不是编写这样的测试的正确方法。最后我的问题是,我如何编写两个单独的测试,首先 - 当我使用外键到达数据记录时(应该获得禁止状态),其次 - 当找到“未连接”数据记录时(应该获得成功状态代码)?或者也许完全有另一种方式来测试这样的控制器?谢谢你的回答!

标签: asp.net-web-apiintegration-testingintegrationxunit

解决方案


推荐阅读