【问题标题】:How to unit test void method of web api controller如何对web api控制器的void方法进行单元测试
【发布时间】:2018-11-15 21:06:32
【问题描述】:

我在控制器中有一个将数据插入本地数据库的 void 方法。我如何对该方法进行集成测试。

到目前为止我已经尝试过了,不知道在断言中添加什么。

 [TestMethod]
    public void ProcessTransactions()
    {
        // Arrange
        _transactionController = new TransactionController(_transactionService, _mService);

        // Act
        _transactionController.ProcessTransactions;

        // Assert
    }

【问题讨论】:

  • 您需要检查 Act 是否按预期完成。您问人们如何访问内部状态进行检查?如果这是您的问题,答案是 - 控制反转和服务位置。
  • 我可以在不更新控制器方法的情况下检查 post 方法是否返回任何错误吗?
  • 当然,如果发生这种情况,您的方法应该抛出异常。然后测试会自动失败,你不需要断言任何东西。
  • 我很好奇为什么 web api 控制器操作是无效的,并且不像您之前的一些示例那样返回 IHttpActionResultHttpResponseMessage

标签: c# unit-testing asp.net-web-api controller integration-testing


【解决方案1】:

您有几个选项,具体取决于您想要测试的内容以及您想要测试的深度。

  1. 如果你想检查你的控制器与它的依赖关系的交互,你可以使用一个模拟(例如模拟你的_transactionService)并断言在模拟上调用了哪些方法,使用什么参数等。我个人这样做 但不推荐这种类型的测试。它们使您的代码非常抗重构。它并没有真正测试您的应用的功能,而是测试您的应用的如何,这对我来说意义不大。
  2. 您可以在类的真实实现上运行测试(没有模拟)。然后,您应该专注于在测试方法执行后验证系统状态(例如数据库中的内容)。这种测试对我来说效果更好,但是它们要求您首先使用一些种子数据设置数据库,这在大型系统中可能是一个很大的麻烦。由于数据库通信,尤其是需要事先安排数据库状态,这些测试运行缓慢。
  3. 您也可以跳过控制器的测试,或者非常粗略地进行测试并专注于测试您的域逻辑。进行一些简单的测试来验证您的控制器是否正常工作仍然很好。

这个问题没有明确的答案。这一切都“取决于”,但我希望我能阐明一些可能性。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2021-10-15
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多