oliverdavies.uk/content/node.7a90ce1b-f0d9-443b-b143-b82562fef529.yml

213 lines
6.4 KiB
YAML

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: |
<p>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.</p>
<p>For example, if we have this test:</p>
<pre><code class="language-php">&lt;?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-&gt;installEntitySchema(entity_type_id: 'node');
$this-&gt;installEntitySchema(entity_type_id: 'user');
}
public function testExample(): void {
$user = $this-&gt;createUser();
$article = $this-&gt;createNode([
'title' =&gt; 'Test article',
'uid' =&gt; $user,
]);
self::assertSame('1', $article-&gt;getOwnerId());
}
}
</code></pre>
<p>Both creation traits must be imported, the <code>node</code> and <code>user</code> modules must be enabled, and the entity tables must be installed.</p>
<p>When writing a lot of tests, this can result in duplication and more complex tests that take longer to write.</p>
<p>This can be simplified using <code>EntityKernelTestBase</code> instead of <code>KernelTestBase</code>:</p>
<pre><code class="language-php">&lt;?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-&gt;createUser();
$article = $this-&gt;createNode([
'title' =&gt; 'Test article',
'uid' =&gt; $user,
]);
self::assertSame('1', $article-&gt;getOwnerId());
}
}
</code></pre>
<p>The class is simpler, fewer modules must be specified, and the entity schemas are automatically installed.</p>
<p>As well as the core modules, some contrib modules also provide their own base test cases.</p>
<p>If you're using the Webform module, you may want to use <code>WebformAccessTestBase</code> instead of the standard <code>UnitTestCase</code>.</p>
<p>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.</p>
format: full_html
processed: |
<p>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.</p>
<p>For example, if we have this test:</p>
<pre><code class="language-php">&lt;?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-&gt;installEntitySchema(entity_type_id: 'node');
$this-&gt;installEntitySchema(entity_type_id: 'user');
}
public function testExample(): void {
$user = $this-&gt;createUser();
$article = $this-&gt;createNode([
'title' =&gt; 'Test article',
'uid' =&gt; $user,
]);
self::assertSame('1', $article-&gt;getOwnerId());
}
}
</code></pre>
<p>Both creation traits must be imported, the <code>node</code> and <code>user</code> modules must be enabled, and the entity tables must be installed.</p>
<p>When writing a lot of tests, this can result in duplication and more complex tests that take longer to write.</p>
<p>This can be simplified using <code>EntityKernelTestBase</code> instead of <code>KernelTestBase</code>:</p>
<pre><code class="language-php">&lt;?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-&gt;createUser();
$article = $this-&gt;createNode([
'title' =&gt; 'Test article',
'uid' =&gt; $user,
]);
self::assertSame('1', $article-&gt;getOwnerId());
}
}
</code></pre>
<p>The class is simpler, fewer modules must be specified, and the entity schemas are automatically installed.</p>
<p>As well as the core modules, some contrib modules also provide their own base test cases.</p>
<p>If you're using the Webform module, you may want to use <code>WebformAccessTestBase</code> instead of the standard <code>UnitTestCase</code>.</p>
<p>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.</p>
summary: null
field_daily_email_cta: { }