PHP - 如何处理应该存在于应用程序命名空间中的真实测试双打?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP - 如何处理应该存在于应用程序命名空间中的真实测试双打?相关的知识,希望对你有一定的参考价值。

我有一个客户端类,它使用魔术__call方法来构造和端点类。

class Client
{
    public function __call($name, $arguments)
    {
        $className = "\App\Endpoints\" . ucfirst($name);

        if (! class_exists($className)) {
            throw new InvalidEndpointException("The `{$name}` endpoint was not configured.");
        }

        return new $className($this->getHttpClient());
    }

    // other methods
}

我的端点命名空间是AppEndpoints。值得一提的是,我的所有端点都从一个包含所需逻辑的抽象Endpoint类扩展而来。端点本身几乎是空的,它们只包含端点url,或者在某些情况下还有一些非REST方法的其他方法。

现在我想测试魔术方法,并不是真的想要使用该命名空间中的真实端点,而是想编写我自己的测试双精度。为了做到这一点,我必须将ClientTest类中的test double置于真正的命名空间AppEndpoints下。此课程仅适用于此测试。

这就是我在ClientTest课上的内容

namespace AppTests;

class ClientTest extends TestCase
{
    public function testItReturnsTheCorrectEndpointWhenCalled()
    {
        $resources = $this->client->myTestResources();

        $this->assertInstanceOf(Endpoint::class, $resources);
    }
}

namespace AppEndpoints;

class MyTestResources extends Endpoint
{
    public static $endpoint = 'myTestResources';
}

有没有更好的方法来实现这一目标?

答案

模拟可能是最好的方法。 There’s some notes about them in the PHPUnit docs,或者你可以参考你的框架(如果你正在使用它)。例如,Laravel,has a range of mocks

以上是关于PHP - 如何处理应该存在于应用程序命名空间中的真实测试双打?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理应用内计费库中的多个用户? (最佳实践)

如何处理应用内购买的退款/取消

如何处理应用程序启动时发生的 ASP.NET 应用程序错误以及 MVC 视图中的传输和显示错误?

如何解开其类存在于不同命名空间(python)中的对象?

程序设计中关于Java 异常处理应注意的问题

删除存在于另一个命名空间 rails 中的模型