【问题标题】:How I can have on each phpunit test specific tearDown logic?我怎样才能在每个 phpunit 测试特定的拆解逻辑?
【发布时间】:2020-04-02 12:29:35
【问题描述】:

在我的 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 生成数据库上的数据,虚构的EmailEntriesUser 代表记录数据。 delete 上的方法 EmailEntriesUser

但是,如果在测试开发过程中出现某些问题,那么作为清理代码的删除可能会被删除。此外,泛型tearDown 是泛型方法,不允许指定特定方法来指示测试所需的拆解逻辑。例如,在我的情况下,testEmailValid 上的拆解逻辑在testEmailValidOnUser 上的 id 不同,如果由于拼写错误而出现问题,最终可能无法运行它,因此不会给我测试隔离。

那么,无论测试是否成功,我如何才能让每个测试特定的拆解逻辑都将被执行?

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    做到这一点的唯一方法是使用单独的类。如果您在每个测试中需要不同的拆解逻辑,那么您要么存在架构问题,要么正在测试不同的功能,要么就是没有足够好的拆解策略。

    通常,在拆卸逻辑期间,简单的截断逻辑就足够了。

    【讨论】:

      【解决方案2】:

      我建议在这里使用数据库事务。你真的想在两个测试中做同样的事情:回滚对数据库所做的任何更改。

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

      这样您就不需要为每个测试设置特殊的逻辑,并且如果您影响的表比预期的多,您仍然是安全的。

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 2022-11-28
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        相关资源
        最近更新 更多