我如何在每个 phpunit 测试特定的拆卸逻辑?

在我的 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上的方法。EmailEntriesUser


但是,如果在测试开发过程中出现一些 brak mucase 删除,即清理代码可能会被删除。此外,通用tearDown是通用的方式,不允许指定特定方法来测试所需的拆卸逻辑。例如,在我的例子中,testEmailValidid Different on 上的拆卸逻辑testEmailValidOnUser,如果由于打字错误而损坏,可能最终无法运行它,因此不会给我测试隔离。


那么,无论测试成功与否,我如何才能拥有将执行的每个测试特定的拆卸逻辑?


天涯尽头无女友
浏览 84回答 2
2回答

料青山看我应如是

唯一的方法是使用单独的类。如果每个测试都需要不同的拆卸逻辑,那么您要么遇到架构问题,要么正在测试不同的功能,要么就是没有足够好的拆卸策略。通常,在拆卸逻辑期间,简单的截断逻辑就足够了。

桃花长相依

我建议在这里使用数据库事务。你真的想在两个测试中做同样的事情:回滚对数据库所做的任何更改。public function setUp(): void{    MyDatabaseClass:startTransaction();}public function tearDown(): void{    MyDatabaseClass:rollback();}这样您就不需要为每个测试都设置特殊的逻辑,而且如果您影响的表比预期的多,您仍然是安全的。
打开App,查看更多内容
随时随地看视频慕课网APP