我试图使用带有phpspec的TDD为API类创建一个包装器。
我编写了一个Client类,它处理从REST请求/检索数据的问题,然后映射到一个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()测试会是什么样子呢?
希望这是合理的,可以提供更多的信息,如果需要。
谢谢你看一看。
发布于 2014-11-11 14:59:17
我不确定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,我认为测试它基本上是不可能的(不实际调用服务),但也许您可以使用口香糖。在ClientSpec中,您将模拟HttpClient并测试Client是否使用正确的消息和参数调用它。
我希望这能帮到你!
https://stackoverflow.com/questions/26712498
复制相似问题