0

我正在尝试使用带有 phpspec 的 TDD 为 API 类创建一个包装器。

我编写了一个Client类,它处理从 REST API 请求/检索数据,然后将其映射到几个Entity类,因此它的行为类似于 ORM。

我现在有点卡住了,我来测试和使用 TDD 扩展应用程序。由于Client是实体类的依赖项(以便他们可以请求自己的子对象),我正在努力模拟它。

例如,以下是其中一个实体Comic.php, 可能的样子:

class Comic {

  protected $client;

  public $id;

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

  public function getCharacters()
  {
    // just an example, this would return an array of Character objects
    return $this->client->request("comic/{$this->id}/characters");
  }

}

为简洁起见,这里是简化版的Client.php样子:

class Client {

  public function __construct($publicKey, $privateKey)
  {
    // make token from $publicKey, $privateKey
  }

  public function request($endpoint)
  {
    // use token for cURL request to endpoint and return data
  }

}

那么作为一个例子,一个测试看起来ComicSpec.php如何呢?it_gets_all_characters()

希望这是有道理的,如果需要可以提供更多信息。

谢谢参观。

4

1 回答 1

0

我不确定it_gets_all_characters你会测试什么,ComicSpec因为让所有角色看起来不像是一项Comic责任。正确的?

必须做Comic的(它的职责)是调用客户端并信任它来检索字符。因此,您应该使用正确的消息和参数ComicSpec模拟Client和测试调用它:Comic

ComicSpec

function it_gets_all_characters(Client $client)
{
    $this->beConstructedWith($client);

    $client->request(Argument::any())->shouldBeCalled();

    $this->getCharacters();
}

请注意,您尚未测试 API 调用,因此您还需要ClientSpec执行此操作。如果你使用curl我认为基本上不可能测试它(没有实际调用服务),但也许你可以使用Guzzle。在ClientSpec你将模拟 HttpClient 并测试Client使用正确的消息和参数调用它。

我希望这有帮助!

于 2014-11-11T14:59:17.550 回答