测试依赖于外部API调用的用户工厂的好方法是什么

时间:2015-06-10 15:56:39

标签: php rest unit-testing phpunit

我有一个非常直接的用户工厂,除了它取决于外部API调用。由于外部调用已使用特定用户详细信息进行身份验证,因此我不确定是否必须模拟响应或请求?

我的问题是,对于用户测试此工厂的好方法是否有任何建议?

谢谢!

public static function getUser($id)
{
    if (!IntegerValidator::valid($id)) {
        throw new ValidationException('Invalid id provided');
    }

    $path = "/users/{$id}";
    $cache = MemcachedManager::get($path);

    if ($cache) {
        return $cache;
    }

    $client = ClientFactory::getClient();
    $result = $client->get($path);

    $user = static::createUserFromResult($result);

    MemcachedManager::set($path, $result);

    return $user;
}

2 个答案:

答案 0 :(得分:1)

要使这个可测试,您需要重构代码。您可以非常轻松地在PHPUnit中模拟依赖项,并为其公共API方法调用创建模拟响应。对于您想要实现的目标,您需要将public static void main(String[] args) { Integer[] repetition = new Integer[] { 4, 6, 4, 4, 6, 5, 7, 4, 3, 3 }; int maxValue = Collections.max(Arrays.asList(repetition)); System.out.println("Maximum: " + maxValue); for (int i = maxValue; i > 0; i--) { for (int j = 0; j < repetition.length; j++) { if (repetition[j] >= i) { System.out.print(" * "); } else { System.out.print(" "); } } System.out.println(); } for (int j = 0; j < repetition.length; j++) { System.out.print(" " + (j + 1) + " "); } } 注入到方法中,然后您可以在其中使用模拟对象进行单元测试。

答案 1 :(得分:1)

你需要DI来实现这一点。

class Something
{
    private $client;

    public function __construct(Client $client)
    {
        $this->client = $client;
    }

    public function getUser($id)
    {
        //...
        $result = $this->client->get($path);
    }
}

class MyTest extends \PHPUnit_Framework_TestCase
{
    public function testSomething()
    {
        $someResult = ''; // Here goes your result

        $clientMock = $this->getMockBuilder(Client::class)->disableOriginalConstruction->getMock();
        $clientMock->method('get')->willReturn($someResult);

        $something = new Something($clientMock);
        $something->getUser(1);
    }
}

尽可能避免使用静态方法。注入依赖项通常比使用静态方法更好,因为你无法模拟它们。