Как я могу иметь на каждом тесте phpunit спецификацию c tearDown logi c? - PullRequest
0 голосов
/ 02 апреля 2020

В моих тестах phpunit мне нужно запустить функцию очистки для каждого теста отдельно, например:

use PHPUnit\Framework\TestCase;

use MyApp\Database\DatabaseEntryDataGenerator;
use MyApp\Database\Record\User;
use MyApp\Database\Record\Emails;

class MyEmailTest extends TestCase
{

   public function testEmailValid()
   {
     /**
      * @var EmailEntries
      */
     $emails=DatabaseEntryDataGenerator::table(EmailEntries::TABLE)->generate();

     //Do test
    $emails->delete();
   }

   public function testEmailValidOnUser()
   {
     /**
      * @var User
      */
     $user=DatabaseEntryDataGenerator::table(User::TABLE)->generateSingle(1);
     /**
      * @var EmailEntries
      */
     $emails=DatabaseEntryDataGenerator::table(EmailEntries::TABLE)->generateMultiple();

     //Do test
    $emails->delete();
    $user->delete();
   }
}

Предположим, что вымышленный DatabaseEntryDataGenerator генерирует данные в базе данных, а вымышленный EmailEntries и User представлять данные записи. Метод delete на EmailEntries и User.

Но если во время разработки теста что-то не получится, может быть удалено удаление, то есть код очистки. Кроме того, generi c tearDown является способом generid и не позволяет указывать конкретный c метод, указывающий на проверку требуемой логики tearDown c. Например, в моем случае логарифм демонтажа c на testEmailValid id Отличается на testEmailValidOnUser и, если что-то сломалось, например, из-за опечатки, может закончиться тем, что не сможет его запустить вообще, следовательно, не предоставит мне тестовую изоляцию.

Итак, как я могу задать для каждого теста спецификацию c разрушить логи c, которые будут выполняться независимо от того, успешен тест или нет?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Единственный способ сделать это - использовать отдельные классы. Если вам нужны разные логики разрыва c для теста, у вас либо проблемы с архитектурой, либо вы тестируете разные функциональные возможности, либо у вас просто нет достаточно хорошей стратегии разрыва.

Часто простые логики усечения c будет достаточно во время демонтажа логи c.

0 голосов
/ 02 апреля 2020

Я бы предложил использовать транзакцию базы данных здесь. Вы действительно хотите сделать одно и то же в обоих тестах: откатить любые изменения, внесенные в базу данных.

public function setUp(): void
{
    MyDatabaseClass:startTransaction();
}

public function tearDown(): void
{
    MyDatabaseClass:rollback();
}

Таким образом, вам не нужно будет иметь специальные логи c для каждого теста, и если вы влияют на большее количество таблиц, чем ожидалось, вы все равно будете в безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...