gpt4 book ai didi

c# - c# web api 中的最小起订量单元测试

转载 作者:行者123 更新时间:2023-11-30 21:26:38 25 4
gpt4 key购买 nike

我正在尝试在 asp.net core 2 中测试一个 web api 方法。

网络接口(interface)

方法:

public IActionResult Delete(int id)
{
try
{
var success = sportsService.DeleteSport(id);

if (!success)
{
return new NotFoundResult();
}
return new OkResult();
}
catch (Exception e)
{
return new StatusCodeResult(400);
}
}

单元测试部分:

private Mock<ISportsService> mockService;

[SetUp]
public void Setup()
{
mockService.SetupSequence(x => x.DeleteSport(It.IsAny<int>())).
Returns(true). // OkResult();
Returns(false). // NotFoundResult()
Throws(new Exception()); //Exception
}

测试方法如下所示。我对这种方法不清楚的是,测试该方法的正确方法是什么?

[Test]
public void TestStrategyControllerWithDelete()
{
var result = controller.Delete(STRAT_ID);
var okResult = result as ObjectResult;
Assert.AreEqual(HttpStatusCode.NotFound, okResult.StatusCode);
Assert.AreEqual(HttpStatusCode.OK, okResult.StatusCode);
Assert.AreEqual(400, okResult.StatusCode);
}

我确定结果为空! 并且无法获取 okResult.StatusCode

最佳答案

您正在设置您的 mock 以:

  • 第一次调用时返回true
  • 第二次调用返回false
  • 再次调用时抛出new Exception()

但是,在您的测试中您只调用一次 (var result = controller.Delete(STRAT_ID); 因此您的 Moq 将始终返回 true

编写 3 个单独的测试,而不是一个:

[Test]
public void Delete_ReturnsOkResult_IfDeleteSuccess()
{
const int deleteId = 1234;
mockService.Setup(x => x.DeleteSport(deleteId)).Returns(true);

var result = controller.Delete(deleteId);

Assert.IsInstanceOf<OkResult>(result);
}

单元测试应该是独立的。它们应该能够以任何顺序运行而不会相互干扰。但是,通过在 [SetUp] 步骤中配置 SetupSequence(),您至少将其中的 3 个绑定(bind)在一起并强制对它们进行排序。

编辑“并且无法获取 okResult.StatusCode”* 更新问题

您返回的是 OKResult , NotFoundResultStatusCodeResult .这些都不是从 ObjectResult 继承的,这就是它为 NULL 的原因。我已经更新了我的代码示例以检查显式类型 (OKResult),这将需要针对每个测试用例进行更新。

如果你想检查单个 StatusCodes,你可以将它转换为 StatusCodeResult,因为所有返回类型都可以转换为这个。

关于c# - c# web api 中的最小起订量单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58992517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com