Я настраиваю Codeception для тестирования Api.
У меня есть класс Cest, скажем …
class ZooCest {
public function addingALionToZoo(ApiTester $I)
{
$I->sendPost('zoo/add_animal', ['animal_id' => $animalId]);
}
}
Вопрос в том, где и как мне настроить данные для проверки моего API.
Следуя предыдущему примеру, я мог бы сделать это:
class ZooCest {
public function addingALionToZoo(ApiTester $I)
{
$lion = new Animal('lion');
$lion->save();
$I->sendPost('zoo/add_animal', ['animal_id' => $lion->getId()]);
}
}
Но это становится грязным, когда бизнес-логика сложна.
Я мог бы иметь фактор-фактор в папке поддержки, поэтому я мог бы так:
class ZooCest {
public function addingALionToZoo(ApiTester $I)
{
$lion = DataFactory::create('lion');
$I->sendPost('zoo/add_animal', ['animal_id' => $lion->getId()]);
}
}
Но это может сильно возрасти, становясь все более и более сложным с течением времени, достигая точки, в которой нам, возможно, даже понадобится проверить эту логику! (да, это шутка)
Благодарю.
Я не думаю, что есть «лучшее место» для этого, поскольку все зависит от вашего проекта и ваших тестов, так что это больше похоже на теоретический ответ.
Если у вас есть (или может быть) такая много логики, я бы, вероятно, создал бы новый каталог именно для такого рода вещей, где вы можете создать столько классов, сколько это имеет смысл для вас. Например:
- app
- TestsData
- Zoo.php
- Oceanarium.php
- Theatre.php
- Shop.php
Из вас можно пойти еще дальше и разделить это так:
- app
- TestsData
- Zoo
- Lion.php
- Monkey.php
- Oceanarium
- Shark.php
В любом случае, вы можете создать несколько методов в каждом классе, чтобы «заполнить» базу данных нужной вам информацией (демонстрация для TestsData / Зоопарк / Lion.php).
<?php
use Animal;
class Lion
{
public static function add() {
$lion = new Animal('lion');
$lion->save();
return $lion;
}
}
Затем в ваших тестах используйте:
class ZooCest {
public function addingALionToZoo(ApiTester $I)
{
$I->sendPost('zoo/add_animal', ['animal_id' => Lion::add()]);
}
}
Других решений пока нет …