Skip to content

Instantly share code, notes, and snippets.

@JeffreyWay
Last active February 9, 2019 05:56
Show Gist options
  • Save JeffreyWay/5348385 to your computer and use it in GitHub Desktop.
Save JeffreyWay/5348385 to your computer and use it in GitHub Desktop.
Quick reminder that you can get away with not injecting Facades. They can be swapped out with mocks quite easily.
<?php
class MyMailer {
public function deliver()
{
// This facade doesn't need to be injected into the class.
Mail::send('emails.welcome', [], function($m)
{
$m->to('[email protected]')
->subject('Welcome to the site')
->setCharset('UTF-8');
});
}
}
class ExampleTest extends TestCase {
public function tearDown()
{
Mockery::close();
}
public function testBasicExample()
{
// mock it
Mail::shouldReceive('send')->once();
(new MyMailer)->deliver();
}
}
@mikedfunk
Copy link

This is fantastic! Can this even be done with PHPUnit's getMock? I didn't realize you could mock a static class!

@mikedfunk
Copy link

This worked with the Mail class but not with a model. I am confused as to why. When I tried the same thing with a model, PHPUnit said the method shouldReceive was not defined.

@asakurayoh
Copy link

It's not the Mail class, but the Mail Facade. Only facade got this magic.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment