【问题标题】:What's the correct way to stub functionality for PHPUnit testing?为 PHPUnit 测试存根功能的正确方法是什么?
【发布时间】:2010-10-26 12:32:00
【问题描述】:

我正在尝试为连接到 API 的类编写一些单元测试。

我想要做的是改变类,这样它就不会实际连接到 API,而是加载一个预取的常量固定装置。实际执行 cURL 请求并返回数据的类中的方法受到保护,这是我要更改为返回夹具文件内容的方法。

我的问题是最好的方法是什么?

我读过关于 PHPUnit 中的模拟对象,但是因为我想更改的方法是内部的和受保护的,我认为我不能使用这些对吗?

我是否正确假设我需要扩展类并自己更改方法?

谢谢。

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

    Mocks 和 Stubs 的目的是取代依赖功能的依赖,例如当你有类似的东西时

    class Foo
    {
        public function __construct($apiConnector) {
            $this->apiConnector = $apiConnector
        }
    }
    

    其中$apiConnector 是用于调用 API 的依赖项,然后您使用自己的实现来存根或模拟该依赖项。由于 Foo 通过其面向公众的接口调用该依赖项,因此您可以存根触发依赖项中受保护方法的方法。

    但是,如果没有依赖关系,但对 API 的调用是从 testclass 进行的,那么您必须编写一个自定义类来扩展您的 testclass 并实现它自己的 API 调用函数,例如

    class FooMock extends Foo
    {
        protected function queryAPI()
        {
            return $fixture;
        }
    }
    

    然后您将测试这个类而不是实际的类。

    如果您的类实际上是连接到 WebService,请参阅章节Stubbing and Mocking WebServices

    【讨论】:

    • 调用受保护的方法做了很多处理。它验证参数,调用 API,将响应传递给响应对象,然后对其进行解析,最后返回响应对象。我想测试该方法是否返回一个有效的 Response 对象,所以我不确定我应该在这里测试什么。
    • @Stephen 只是为了清楚起见,您要存根的方法是在要测试的类中还是依赖项,例如一个单独的类?
    • @Gordon 我要存根的方法是与调用它的公共方法相同的类中的受保护方法。除了调用受保护的方法之外,公共方法还执行我想要测试的其他处理。我想要做的是通过使受保护的方法返回静态夹具来消除对 API 的依赖,因此公共方法中的其余过程可以运行并正确测试。如果这是有道理的。
    • @Gordon 这就是我的想法,谢谢。相反,我可能会考虑重写我的类,以便可以注入 API 连接器。对于本质上的一个 API 调用来说,这似乎有点过头了,但它确实更具有设计意义。
    • 看来您实际上也可以模拟受保护的方法,仅供参考。
    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2019-07-17
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多