Я пытаюсь создать оболочку для класса API, используя TDD с phpspec.
Я написал 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()
посмотрите, как пример?
Надеюсь, что это имеет смысл, может предоставить больше информации, если это необходимо.
Спасибо, что посмотрели.
Я не уверен 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
вызывает его с правильным сообщением и параметрами.
Надеюсь, это поможет!
Других решений пока нет …