Test Cases
The following test-case abstractions are available. All test-cases inherit from Codeception's Unit
test-case (extended version of PHPUnit Test-Case).
Prerequisite
It is recommended that you have some experience working with Codeception. Please read their documentation before continuing here.
Unit Test-Case
A basic unit test-case that has a Faker instance setup. Furthermore, Mockery is automatically closed after each test. This abstraction is mostly suited for testing single components in isolation.
use Aedart\Testing\TestCases\UnitTestCase;
class MyTest extends UnitTestCase
{
/**
* @test
*/
public function isFakerAvailable()
{
$value = $this->getFaker()->address();
$this->assertNotEmpty($value);
}
}
Faker Locale
To change the locale that the Faker instance should use, set the $FakerLocale
property.
class MyTest extends UnitTestCase
{
protected string|null $FakerLocale = 'da_DK';
// ... remaining not shown ...
}
See the source code of Aedart\Testing\TestCases\Partials\FakerPartial
for additional information.
Integration Test-Case
The IntegrationTestCase
abstraction is suitable for more complex testing. It automatically creates a Service Container instance before each test and destroys it again after each test. This allows you to test components that depend on the Service Container.
This test-case inherits from the UnitTestCase
abstraction, meaning that a Faker instance is available and Mockery is also setup.
use Aedart\Testing\TestCases\IntegrationTestCase;
use Acme\Users\UserModel;
use Acme\Data\DataLink;
class MyTest extends IntegrationTestCase
{
/**
* @test
*/
public function canCreateSpecialComponent()
{
// E.g. bind instances
$this->ioc->bind('data-link', function(){
return new DataLink();
});
// E.g. resolve components that depend on other
// components...
$userModel = $this->ioc->make(UserModel::class);
// Or perhaps...
$otherUserModel = new UserModel($this->ioc);
$otherUserModel->name = $this->getFaker()->name();
// ... remaining not shown ...
}
}
Service Container As Application
Warning
By default, the created Service Container instance is automatically registered as "application". This means that it binds itself as the app
keyword (Laravel Application). This can be useful for testing your components in combination with Laravel's Service Providers or other Laravel core components. But this can also result in very unexpected and undesirable behaviour. Please be very careful how use make use of this!
How to disable
To disable this behaviour, set $registerAsApplication
to false
.
class MyTest extends IntegrationTestCase
{
protected bool $registerAsApplication = false;
// ... remaining not shown ...
}
See registerAsApplication()
for additional information.
Laravel Test-Case
The LaravelTestCase
starts a new Laravel application before each test and destroys it again, after each test has completed. It utilises Orchestra Testbench to achieve this. It inherits from the IntegrationTestCase
and therefore also offers the same features and previously shown.
Note
The $registerAsApplication
property is set to false
in this test-case.
use Aedart\Testing\TestCases\LaravelTestCase;
class MyTest extends LaravelTestCase
{
/**
* @test
*/
public function canAccessLaravelComponents()
{
$redis = $this->ioc->make('redis');
// ... remaining not shown ...
}
}
Browser Test-Case
BrowserTestCase
can be used for writing tests to be executed in a browser. Laravel Dusk is used behind the scene. Please review the Test-Case's source code and Laravel documentation for additional information.
use Aedart\Testing\TestCases\BrowserTestCase;
use Laravel\Dusk\Browser;
class MyBrowserTest extends BrowserTestCase
{
public function canVisitPage()
{
$this->browse(function(Browser $browser) {
$browser
->visit('https://www.google.com/')
->waitForText("I'm Feeling Lucky")
});
}
}
TIP
In order to run browser tests, you will be required to have the correct ChromeDriver
binary installed. You can use the following to install the binary:
vendor/bin/dusk-updater update
Athenaeum Test-Case
If you are using the Athenaeum Core Application, then you can use the AthenaeumTestCase
to help you test your components or application. It only offers a few handful of the testing capabilities that the Laravel Test-Case does. However, it might just be enough to get you started.
The test-case ensures that an application instance is created before each test, and destroyed after each test has completed. Since it also inherits from IntegrationTestCase
, it too offers the Faker instance and Mockery setup.
use Aedart\Testing\TestCases\AthenaeumTestCase;
class MyTest extends AthenaeumTestCase
{
/**
* @test
*/
public function canExecuteCustomCommand()
{
$exitCode = $this
->withoutMockingConsoleOutput()
->artisan('pirate:talk');
// ... remaining not shown ...
}
}
For additional information, please review the source code of the AthenaeumTestCase
.