uuid: - value: 7a90ce1b-f0d9-443b-b143-b82562fef529 langcode: - value: en type: - target_id: daily_email target_type: node_type target_uuid: 8bde1f2f-eef9-4f2d-ae9c-96921f8193d7 revision_timestamp: - value: '2025-05-11T09:00:26+00:00' revision_uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 revision_log: { } status: - value: true uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 title: - value: | Finding the best test base created: - value: '2023-11-27T00:00:00+00:00' changed: - value: '2025-05-11T09:00:26+00:00' promote: - value: false sticky: - value: false default_langcode: - value: true revision_translation_affected: - value: true path: - alias: /daily/2023/11/27/finding-the-best-test-base langcode: en body: - value: |

As well as different base classes for types of tests - i.e. functional, kernel and unit - there are other test base classes within those that can be used to simplify things.

For example, if we have this test:

<?php

      namespace Drupal\Tests\example\Kernel;

      use Drupal\KernelTests\KernelTestBase;
      use Drupal\Tests\node\Traits\NodeCreationTrait;
      use Drupal\Tests\user\Traits\UserCreationTrait;

      class ExampleTest extends KernelTestBase {

        use NodeCreationTrait;
        use UserCreationTrait;

        protected static $modules = [
          'node',
          'user',
        ];

        public function setUp(): void {
          parent::setUp();

          $this->installEntitySchema(entity_type_id: 'node');
          $this->installEntitySchema(entity_type_id: 'user');
        }

        public function testExample(): void {
          $user = $this->createUser();

          $article = $this->createNode([
            'title' => 'Test article',
            'uid' => $user,
          ]);

          self::assertSame('1', $article->getOwnerId());
        }

      }
      

Both creation traits must be imported, the node and user modules must be enabled, and the entity tables must be installed.

When writing a lot of tests, this can result in duplication and more complex tests that take longer to write.

This can be simplified using EntityKernelTestBase instead of KernelTestBase:

<?php

      use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
      use Drupal\Tests\node\Traits\NodeCreationTrait;

      class ExampleTest extends EntityKernelTestBase {

        use NodeCreationTrait;

        protected static $modules = [
          'node',
        ];

        public function testExample(): void {
          $user = $this->createUser();

          $article = $this->createNode([
            'title' => 'Test article',
            'uid' => $user,
          ]);

          self::assertSame('1', $article->getOwnerId());
        }

      }
      

The class is simpler, fewer modules must be specified, and the entity schemas are automatically installed.

As well as the core modules, some contrib modules also provide their own base test cases.

If you're using the Webform module, you may want to use WebformAccessTestBase instead of the standard UnitTestCase.

It's definitely worth spending some time looking at what base test cases are available and which are the best ones to use for your own tests.

format: full_html processed: |

As well as different base classes for types of tests - i.e. functional, kernel and unit - there are other test base classes within those that can be used to simplify things.

For example, if we have this test:

<?php

      namespace Drupal\Tests\example\Kernel;

      use Drupal\KernelTests\KernelTestBase;
      use Drupal\Tests\node\Traits\NodeCreationTrait;
      use Drupal\Tests\user\Traits\UserCreationTrait;

      class ExampleTest extends KernelTestBase {

        use NodeCreationTrait;
        use UserCreationTrait;

        protected static $modules = [
          'node',
          'user',
        ];

        public function setUp(): void {
          parent::setUp();

          $this->installEntitySchema(entity_type_id: 'node');
          $this->installEntitySchema(entity_type_id: 'user');
        }

        public function testExample(): void {
          $user = $this->createUser();

          $article = $this->createNode([
            'title' => 'Test article',
            'uid' => $user,
          ]);

          self::assertSame('1', $article->getOwnerId());
        }

      }
      

Both creation traits must be imported, the node and user modules must be enabled, and the entity tables must be installed.

When writing a lot of tests, this can result in duplication and more complex tests that take longer to write.

This can be simplified using EntityKernelTestBase instead of KernelTestBase:

<?php

      use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
      use Drupal\Tests\node\Traits\NodeCreationTrait;

      class ExampleTest extends EntityKernelTestBase {

        use NodeCreationTrait;

        protected static $modules = [
          'node',
        ];

        public function testExample(): void {
          $user = $this->createUser();

          $article = $this->createNode([
            'title' => 'Test article',
            'uid' => $user,
          ]);

          self::assertSame('1', $article->getOwnerId());
        }

      }
      

The class is simpler, fewer modules must be specified, and the entity schemas are automatically installed.

As well as the core modules, some contrib modules also provide their own base test cases.

If you're using the Webform module, you may want to use WebformAccessTestBase instead of the standard UnitTestCase.

It's definitely worth spending some time looking at what base test cases are available and which are the best ones to use for your own tests.

summary: null field_daily_email_cta: { }