oliverdavies.uk/content/node.45636e82-61b1-4298-a28c-34f139b9a559.yml

42 lines
4 KiB
YAML

uuid:
- value: 45636e82-61b1-4298-a28c-34f139b9a559
langcode:
- value: en
type:
- target_id: daily_email
target_type: node_type
target_uuid: 8bde1f2f-eef9-4f2d-ae9c-96921f8193d7
revision_timestamp:
- value: '2025-05-14T01:19:06+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: 'Writing your own test traits'
created:
- value: '2025-05-13T01:08:34+00:00'
changed:
- value: '2025-05-14T01:19:06+00:00'
promote:
- value: false
sticky:
- value: false
default_langcode:
- value: true
revision_translation_affected:
- value: true
path:
- alias: /daily/2025/05/13/writing-your-own-test-traits
langcode: en
body:
- value: '<p>In Drupal, there are different types of automated tests we can write.</p><p>The most common I use are Functional, Kernel and Unit - which I explain about in <a href="/presentations/tdd-test-driven-drupal">my Test Driven Drupal talk</a>.</p><p>If I''m writing multiple of the same type, I''ll often create my own base test class that extends <code>BrowserTestCase</code>, <code>KernelTestCase</code> or whatever base class I need rather than extending it directly.</p><p>This allows me to write custom helper functions and share behaviour between the tests.</p><p>An example is the <code>createDailyEmailNode</code> method I wrote to simplify creating daily emails in my tests <a href="/daily/2025/05/11/email-archive-tome">since migrating to Tome</a>.</p><p>But, what if you want to do this for different types of test?</p><p>Enter, traits.</p><p>Traits are a way of reusing code without inheritance - meaning without extending a base class.</p><p>I can use a trait in my functional and kernel tests whilst both extend their required base classes.</p><p>I did this with my <code>createDailyEmailNode</code> method so I could re-use it in both types of tests when counting the number of sent daily emails.</p><p>To see this, you can <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/commit/88ec3d9e5136c6cbefebba063863ef1a058f4b09/modules/opd_daily_emails/tests/src">look at the code</a> on my Forgejo instance.</p><p>P.S. If you want to learn how to write automated tests in Drupal, subscribe to <a href="http://localhost:8888/atdc">my free 10-day email course</a>.</p>'
format: basic_html
processed: '<p>In Drupal, there are different types of automated tests we can write.</p><p>The most common I use are Functional, Kernel and Unit - which I explain about in <a href="/presentations/tdd-test-driven-drupal">my Test Driven Drupal talk</a>.</p><p>If I''m writing multiple of the same type, I''ll often create my own base test class that extends <code>BrowserTestCase</code>, <code>KernelTestCase</code> or whatever base class I need rather than extending it directly.</p><p>This allows me to write custom helper functions and share behaviour between the tests.</p><p>An example is the <code>createDailyEmailNode</code> method I wrote to simplify creating daily emails in my tests <a href="/daily/2025/05/11/email-archive-tome">since migrating to Tome</a>.</p><p>But, what if you want to do this for different types of test?</p><p>Enter, traits.</p><p>Traits are a way of reusing code without inheritance - meaning without extending a base class.</p><p>I can use a trait in my functional and kernel tests whilst both extend their required base classes.</p><p>I did this with my <code>createDailyEmailNode</code> method so I could re-use it in both types of tests when counting the number of sent daily emails.</p><p>To see this, you can <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/commit/88ec3d9e5136c6cbefebba063863ef1a058f4b09/modules/opd_daily_emails/tests/src">look at the code</a> on my Forgejo instance.</p><p>P.S. If you want to learn how to write automated tests in Drupal, subscribe to <a href="http://localhost:8888/atdc">my free 10-day email course</a>.</p>'
summary: ''
field_daily_email_cta: { }