The biggest objective of this course is to teach you how to TDD something real; not just another cookie-cutter to-do app.
Test-Driven Laravel
We cover fundamentals like:
- What test should you write first
- Organizing your test suite
- Feature tests vs. unit tests
- Testing validation rules
- Testing events and background jobs
- Working with test databases
- Speeding up your tests with test doubles
...as well as hard topics, like:
- Testing code that interacts with third-party services
- Writing your own test doubles from scratch
- Testing automated payouts with Stripe Connect
- Testing the sending of mass emails
- How to test race conditions
- Testing file uploads and server side image processing
Test-Driven Laravel teaches you how to design a solid test suite for a real-world, marketable product that you could actually charge money for.
About the Author: adamwathan
Adam Wathan is the creator of Tailwind CSS, the utility-first CSS framework that has become the dominant styling solution for new web projects since its 2017 launch. Tailwind reshaped how a generation of developers writes CSS — composing styles from short utility classes inline rather than authoring custom CSS files.
Adam runs Tailwind Labs alongside Steve Schoger and the rest of the Tailwind team, shipping the framework, Tailwind UI (a paid component library), Headless UI (an accessibility-focused unstyled component library), and Heroicons. His courses and screencasts cover Tailwind authoring patterns, refactoring CSS-heavy codebases, and the design decisions behind component design at scale.
Watch Online 166 lessons
| # | Lesson Title | Duration | Access |
|---|---|---|---|
| 1 | What Do We Build First? Demo | 11:30 | |
| 2 | Sketching out Our First Test | 09:06 | |
| 3 | Getting to Green | 16:42 | |
| 4 | Unit Testing Presentation Logic | 11:03 | |
| 5 | Refactoring for Speed | 07:16 | |
| 6 | Hiding Unpublished Concerts | 06:56 | |
| 7 | Testing Query Scopes | 05:50 | |
| 8 | Factory States | 04:10 | |
| 9 | Introducing the Next Feature | 01:02 | |
| 10 | Browser Testing vs Endpoint Testing | 09:47 | |
| 11 | Outlining the First Purchasing Test | 06:23 | |
| 12 | Faking the Payment Gateway | 12:23 | |
| 13 | Adding Tickets to Orders | 05:32 | |
| 14 | Encapsulating Relationship Logic in the Model | 05:16 | |
| 15 | Getting Started with Validation Testing | 06:56 | |
| 16 | Reducing Duplication with Custom Assertions | 05:30 | |
| 17 | Handling Failed Charges | 07:00 | |
| 18 | Preventing Ticket Sales to Unpublished Concerts | 06:40 | |
| 19 | Outlining the First Test Case | 03:46 | |
| 20 | Adding Tickets to Concerts | 08:20 | |
| 21 | Refusing Orders When There Are No More Tickets | 09:29 | |
| 22 | Finishing the Feature Test | 04:25 | |
| 23 | Cancelling Failed Orders | 05:59 | |
| 24 | Refactoring and Redundant Test Coverage | 07:49 | |
| 25 | Cleaning Up Our Tests | 11:57 | |
| 26 | Asserting Against JSON Responses | 07:32 | |
| 27 | Returning Order Details | 06:22 | |
| 28 | This Design Sucks | 04:39 | |
| 29 | Persisting the Order Amount | 05:05 | |
| 30 | Removing the Need to Cancel Orders | 06:01 | |
| 31 | Preparing for Extraction | 07:06 | |
| 32 | Extracting a Named Constructor | 04:46 | |
| 33 | Precomputing the Order Amount | 05:23 | |
| 34 | Uncovering a New Domain Object | 05:11 | |
| 35 | You Might Not Need a Mocking Framework | 03:48 | |
| 36 | Uh Oh, a Race Condition! | 01:43 | |
| 37 | Requestception | 04:17 | |
| 38 | Hooking into Charges | 05:38 | |
| 39 | Uh Oh, a Segfault! | 03:01 | |
| 40 | Replicating the Failure at the Unit Level | 05:04 | |
| 41 | Reserving Individual Tickets | 07:00 | |
| 42 | Reserved Means Reserved! | 03:58 | |
| 43 | That Guy Stole My Tickets! | 05:59 | |
| 44 | Cancelling Reservations | 05:46 | |
| 45 | Refactoring Mocks to Spies | 06:47 | |
| 46 | A Change in Behavior | 05:53 | |
| 47 | Deleting Stale Tests | 05:38 | |
| 48 | Cleaning up a Loose Variable | 06:48 | |
| 49 | Moving the Email to the Reservation | 07:28 | |
| 50 | Refactoring "Long Parameter List" Using "Preserve Whole Object" | 09:50 | |
| 51 | Green with Feature Envy | 06:12 | |
| 52 | Avoiding Service Classes with Method Injection | 09:04 | |
| 53 | Generating a Valid Payment Token | 10:01 | |
| 54 | Retrieving the Last Charge | 04:05 | |
| 55 | Making a Successful Charge | 04:37 | |
| 56 | Dealing with Lingering State | 12:18 | |
| 57 | Don't Mock What You Don't Own | 09:41 | |
| 58 | Using Groups to Skip Integration Tests | 02:19 | |
| 59 | Handling Invalid Payment Tokens | 03:59 | |
| 60 | The Moment of Truth | 04:28 | |
| 61 | When Interfaces Aren't Enough | 04:29 | |
| 62 | Refactoring Towards Duplication | 12:38 | |
| 63 | Capturing Charges with Callbacks | 08:10 | |
| 64 | Making the Tests Identical | 07:42 | |
| 65 | Extracting a Contract Test | 07:42 | |
| 66 | Extracting the Failure Case | 08:24 | |
| 67 | Upgrading to Laravel 5.4 | 04:49 | |
| 68 | Removing the BrowserKit Dependency | 10:26 | |
| 69 | Sketching Out Order Confirmations | 07:52 | |
| 70 | Driving out the Endpoint | 05:21 | |
| 71 | Asserting Against View Data | 05:46 | |
| 72 | Extracting a Finder Method | 06:51 | |
| 73 | Making Static Data Real | 08:49 | |
| 74 | Deciding What to Test in a View | 08:24 | |
| 75 | Decoupling Data from Presentation | 05:11 | |
| 76 | Fixing the Test Suite | 06:28 | |
| 77 | Stubbing the Interface | 06:28 | |
| 78 | Updating Our Unit Tests | 05:16 | |
| 79 | Confirmation Number Characteristics | 04:48 | |
| 80 | Testing the Confirmation Number Format | 07:29 | |
| 81 | Ensuring Uniqueness | 08:44 | |
| 82 | Refactoring to a Facade | 05:59 | |
| 83 | Promoting Charges to Objects | 17:49 | |
| 84 | Leveraging Our Contract Tests | 11:02 | |
| 85 | Storing Charge Details with Orders | 08:01 | |
| 86 | Deleting More Stale Code | 10:27 | |
| 87 | Feature Test and JSON Updates | 08:27 | |
| 88 | Claiming Tickets When Creating Orders | 09:12 | |
| 89 | Assigning Codes When Claiming Tickets | 10:54 | |
| 90 | The Birthday Problem | 11:55 | |
| 91 | Integrating Hashids | 11:44 | |
| 92 | Dealing with Out of Sync Mocks | 04:21 | |
| 93 | Wiring It All Together | 05:19 | |
| 94 | Ready to Demo | 02:52 | |
| 95 | Using a Fake to Intercept Email | 10:35 | |
| 96 | Testing Mailable Contents | 10:39 | |
| 97 | Cleanup and Demo | 02:40 | |
| 98 | Testing the Login Endpoint | 11:26 | |
| 99 | Should You TDD Simple Templates? | 04:42 | |
| 100 | Namespacing Our Test Suite | 06:31 | |
| 101 | Getting Started with Laravel Dusk | 05:22 | |
| 102 | QA Testing the Login Flow | 06:26 | |
| 103 | Preventing Guests from Adding Concerts | 06:24 | |
| 104 | Adding a Valid Concert | 14:20 | |
| 105 | Validation and Redirects | 09:49 | |
| 106 | Converting Empty Strings to Null | 04:21 | |
| 107 | Reducing Noise with Form Factories | 09:13 | |
| 108 | Connecting Promoters and Concerts | 06:49 | |
| 109 | Autopublishing New Concerts | 05:46 | |
| 110 | Asserting Against View Objects | 12:09 | |
| 111 | Avoiding Sort-Sensitive Tests | 05:47 | |
| 112 | Refactoring Assertions with Macros | 11:39 | |
| 113 | Viewing the Update Form | 05:29 | |
| 114 | The First Update Test | 09:27 | |
| 115 | Driving Out Basic Concert Updates | 09:14 | |
| 116 | Restricting Updates to Unpublished Concerts | 11:31 | |
| 117 | Storing the Intended Ticket Quantity | 06:26 | |
| 118 | Updating the Other Tests | 05:25 | |
| 119 | Refactoring Away Some Test Duplication | 07:52 | |
| 120 | Creating Tickets at Time of Publish | 08:28 | |
| 121 | Custom Factory Classes | 07:44 | |
| 122 | Discovering a New Resource | 07:35 | |
| 123 | Creating Published Concerts | 11:12 | |
| 124 | Adding Concerts without Publishing | 04:03 | |
| 125 | Pushing Logic Out of the View | 08:47 | |
| 126 | More Custom Assertion Fun | 06:20 | |
| 127 | Calculating Tickets Sold | 08:22 | |
| 128 | Making the Progress Bar Work | 08:58 | |
| 129 | Total Revenue and a Relationship Bug | 08:40 | |
| 130 | Creating a Custom OrderFactory | 11:28 | |
| 131 | Asserting Against Sort Order | 12:15 | |
| 132 | Splitting Large Tests | 03:41 | |
| 133 | Storing Messages for Attendees | 12:31 | |
| 134 | Confirming That a Job Was Dispatched | 09:27 | |
| 135 | Unit Testing the Job | 18:29 | |
| 136 | Refactoring for Robustness | 11:16 | |
| 137 | Mailable Testing Refresher and Demo | 04:11 | |
| 138 | Upgrading to Laravel 5.5 | 07:41 | |
| 139 | Faking Uploads and File Systems | 10:43 | |
| 140 | Storing Files and Comparing Content | 09:16 | |
| 141 | Validating Poster Images | 07:45 | |
| 142 | Optional Files and the Null Object Pattern | 05:39 | |
| 143 | Testing Events | 10:41 | |
| 144 | Testing the Event Listener | 11:42 | |
| 145 | Resizing the Posted Image | 12:26 | |
| 146 | Optimizing the Image Size | 10:51 | |
| 147 | Upgrading Laravel and Deleting Some Code | 03:40 | |
| 148 | Viewing an Unused Invitation | 10:25 | |
| 149 | Viewing Used or Invalid Invitations | 07:29 | |
| 150 | Registering with a Valid Invitation | 12:46 | |
| 151 | Registering with an Invalid Invitation | 05:20 | |
| 152 | Validating Promoter Registration | 05:54 | |
| 153 | Testing a Console Command | 17:40 | |
| 154 | Sending Promoters an Invitation Email | 05:52 | |
| 155 | Test-Driving the Email Contents | 07:53 | |
| 156 | Getting Cozy with Stripe Connect | 10:55 | |
| 157 | Authorizing with Stripe | 10:05 | |
| 158 | Exchanging Tokens | 17:44 | |
| 159 | Unit Testing Middleware | 13:29 | |
| 160 | Testing Callbacks with Invokables | 09:43 | |
| 161 | Testing That Middleware Is Applied | 08:16 | |
| 162 | Updating Factories and a Speed Trick | 03:30 | |
| 163 | Total Charges for a Specific Account | 10:43 | |
| 164 | Paying Promoters Directly | 07:47 | |
| 165 | Splitting Payments with Stripe | 16:53 | |
| 166 | It's Alive | 04:36 |
Get instant access to all 165 lessons in this course, plus thousands of other premium courses. One subscription, unlimited knowledge.
Learn more about subscriptionRelated courses
-

In Depth Laravel Course (2023 Version)
Sources: Sarthak ShrivastavaThe "In Depth Laravel" course helps developers deepen their knowledge of the Laravel framework, covering architecture, database design, optimization, and...35 hours 46 minutes 3 seconds 5 / 5 -

SAAS Adventure - Learn to Create your own SAAS
Sources: saasadventure.ioIn this 21-day program you will learn you how to create your very own SAAS application!8 hours 37 minutes 3 seconds -

Self-Made SaaS Course
Sources: Andrew SchmelyunMove from idea to a finished application with the video course "Building SaaS Yourself"! You will learn to create a fully functional SaaS application from...5 hours 19 minutes 41 seconds -

Real-Time Data with Laravel Reverb and Vue.js
Sources: vueschool.ioWould you like to add real data handling features to your applications on Laravel and Vue.js? Whether you are creating a notification system, a chat in...44 minutes 56 seconds -

Facebook Clone with Laravel, TDD, Vue & Tailwind CSS
Sources: udemyBuilding modern applications requires a specialized toolbox of skills and tools. We are going to be using Facebook as an example to build a social network platf9 hours 9 minutes 44 seconds -

Scaling Laravel
Sources: serversforhackers.comThe first time I put code into a load balanced environment, I accidentally gave away thousands of dollars in prizes within a few minutes. After pulling an all-nighter to get the…9 hours 29 minutes 45 seconds 5 / 5