Test Doubles
Different types of fakes serve different purposes: stubs return canned data, spies record calls, fakes are simplified implementations.
Different types of fakes serve different purposes: stubs return canned data, spies record calls, fakes are simplified implementations.
// Stub: returns fixed response
$payment = $this->createStub(PaymentGateway::class);
$payment->method("charge")->willReturn(["status" => "ok", "id" => "ch_123"]);
// Spy (PHPUnit mock that checks after the fact)
$mailer = $this->createMock(Mailer::class);
$mailer->expects($this->exactly(2))->method("send");
// Laravel fakes (built-in)
Mail::fake(); Queue::fake(); Storage::fake("public"); Http::fake();
Mail::assertSent(OrderConfirmation::class);
Laravel facades have built-in fake() method — use Mail::fake() instead of mocking the Mail class.