首页 > 解决方案 > API ASP.NET Core 中的单元测试

问题描述

我想对我的所有方法进行一些单元测试(DELETE,PUT,POST ETC ..),但我不知道如何在单元中实例化我的类,现在我在单元类中有这个:

 //Arrange
 var mockRepo = new Mock<IRebelRepository>();
 var controller = new RebelsController(mockRepo.Object);
 //Act
 var rebel = controller.Delete(2);

但现在我想检查 id 是否正确或没有观察我的 API 的响应(OK 或 BadResponse)

public ActionResult<Rebel> Delete(int id)
        {
            _logger.LogInformation("Start of RebelsController.Delete()");
            var result = new ApiResult();
            ActionResult response = null;
            _logger.LogDebug($"Trying to delete rebel ID: {id}");

            try
            {
                if (!ModelState.IsValid)
                {
                    _logger.LogWarning("There was a problem deleting rebel, invalid data");
                    result.Message = "Invalid rebel information.";
                    result.IsError = true;
                    response = BadRequest(result);
                }
                else
                {
                    if (id > 0)
                    {
                        var filteredRebel = _rebelRepository.GetRebelById(id);

                        if (filteredRebel == null)
                        {
                            _logger.LogWarning($"The rebel {id} was not found");
                            result.Message = $"The rebel with id {id} has not been found";
                            result.IsError = true;

                            response = BadRequest(result);

                        }
                        else
                        {
                            _rebelRepository.DeleteRebel(filteredRebel);
                            result.Message = "Rebel deleted correctly";
                            _logger.LogDebug($"Rebel {id} sucessfully deleted");

                            response = Ok(result);
                        }
                    }
                }

            }catch(Exception ex)
            {
                _logger.LogError("An error occurred while Deleted method was running, error :" + ex.Message);
                result.Message = "Error on Delete";
                result.IsError = true;
                response = BadRequest(result);
            }

            _logger.LogInformation("End of RebelsController.Delete()");
            return response;
        }

如何在 API 中进行单元测试?

标签: c#apiasp.net-core

解决方案


因为您response依赖于从 返回的 rebel GetRebelById,因此您应该在使用测试 ID 调用此函数时设置预期结果,例如

var mockRepo = new Mock<IRebelRepository>();
var testId = 2;
mockRepo.Setup(r => r.GetRebelById(testId)).Returns(new Rebel {Id = testId});
var controller = new RebelsController(mockRepo.Object);

var result = controller.Delete(testId);

var actionResult = result.Result;
Assert.IsType<OkObjectResult>(actionResult);
var apiResult = (actionResult as OkObjectResult).Value as ApiResult;
Assert.NotNull(apiResult);
Assert.Equal("Rebel deleted correctly", apiResult.Message);

// should put in another test
var notFoundId = 500;
var result2 = controller.Delete(notFoundId);
var actionResult2 = result2.Result;
Assert.IsType<BadRequestObjectResult>(actionResult2);

推荐阅读