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

时间:2017-12-20 14:00:26

标签: php testing phpunit

我有一个客户端类,它使用魔术__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
}

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

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

这就是我在ClientTest班级

中的内容
namespace App\Tests;

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

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

namespace App\Endpoints;

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

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

1 个答案:

答案 0 :(得分:0)

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