【问题标题】:PHPUnit: How to override and test a dependent methodPHPUnit:如何覆盖和测试依赖方法
【发布时间】:2012-06-13 17:53:39
【问题描述】:

我正在尝试使用 PHPUnit 对 Mail 类的方法编写测试。我正在测试的方法是 saveMessage($arguments)。 saveMessage,除了保存,还可以调用类方法$this->emailMessage( $arguments )。我想编写一个测试 saveMessage 的测试,并测试 emailMessage 是否被正确调用(使用正确的参数),但不调用实际的 emailMessage 方法。

我可以做到这一点的一种方法是将 Mail 子类化,并覆盖 emailMessage 方法。一种更吸引人的方法是模拟 Messages 类,并覆盖 emailMessage 方法,同时在模拟对象中测试 saveMessage 方法。但是,然后我将测试 Mocked 对象本身;我读过这是一个坏主意,但在这种情况下,我不完全确定为什么。为此目的使用模拟对象是否安全?有没有更好的方法来处理这个问题?

【问题讨论】:

  • 我认为您最初的建议 - 创建 Mail 的测试器子类是最简单、最干净的方法。你有理由不想这样做吗?在您的测试中,声明一个初始化为 FALSE 的静态 I_got_here 变量,然后在您覆盖的 emailMessage 函数中,将 I_got_here 变量设置为 true,然后在您的测试中,您断言 I_got_here 为 true。同样,您可以将传递给您覆盖的 emailMessage 函数的参数传回。

标签: unit-testing phpunit


【解决方案1】:

我认为这属于"What to test and what not to test" 类别,在不知道代码的情况下很难回答这个问题。

例如,为什么论点 not 是正确的?他们被操纵了吗?您可以将操作代码放在它自己的方法中并对其进行单元测试。

或者您可以在您的saveMessage 方法中使用asserts,然后在您的单元测试中检查没有触发断言错误。

据我所知,这个问题既关乎代码设计,也关乎测试。

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 2016-02-06
    • 2014-03-26
    • 1970-01-01
    • 2019-04-07
    • 2021-08-17
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多