Define Environment
Testbench utilized phpunit.xml
configuration and TestCase
methods and properties to setup environment variables values as global values for every test.
defineEnvironment()
Method
If you need to add something early in the application bootstrapping process (which is executed between registering service providers and booting service providers) you could use the defineEnvironment()
method:
use Illuminate\Contracts\Config\Repository;
class TestCase extends \Orchestra\Testbench\TestCase
{
/**
* Define environment setup.
*
* @param \Illuminate\Foundation\Application $app
* @return void
*/
protected function defineEnvironment($app)
{
// Setup default database to use sqlite :memory:
tap($app['config'], function (Repository $config) {
$config->set('database.default', 'testbench');
$config->set('database.connections.testbench', [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
]);
// Setup queue database connections.
$config([
'queue.batching.database' => 'testbench',
'queue.failed.database' => 'testbench',
]);
});
}
}
FALLBACK METHOD
You can still use predecessor method getEnvironmentSetup()
for backward compatibility:
/**
* Define environment setup.
*
* @param \Illuminate\Foundation\Application $app
* @return void
*/
protected function getEnvironmentSetup($app)
{
//
}
Using Attribute
You can also use Orchestra\Testbench\Attributes\DefineEnvironment
attribute to customize the use of defineEnvironment()
for specific tests.
use Orchestra\Testbench\Attributes\DefineEnvironment;
use PHPUnit\Framework\Attributes\Test;
class TestCase extends \Orchestra\Testbench\TestCase
{
protected function usesMySqlConnection($app)
{
$app['config']->set('database.default', 'mysql');
}
protected function usesSqliteConnection($app)
{
$app['config']->set('database.default', 'sqlite');
}
#[Test]
#[DefineEnvironment('usesMySqlConnection')]
public function it_can_be_connected_with_mysql()
{
// write your tests
}
#[Test]
#[DefineEnvironment('usesSqliteConnection')]
public function it_can_be_connected_with_sqlite()
{
// write your tests
}
}
Using Annotation
Deprecated
Annotation usage with PHPUnit has been mark as deprecated and will be removed in future versions.
You can also use @define-env
annotation to customize the use of defineEnvironment()
for specific tests.
class TestCase extends \Orchestra\Testbench\TestCase
{
protected function usesMySqlConnection($app)
{
$app['config']->set('database.default', 'mysql');
}
protected function usesSqliteConnection($app)
{
$app['config']->set('database.default', 'sqlite');
}
/**
* @test
* @define-env usesMySqlConnection
*/
public function it_can_be_connected_with_mysql()
{
// write your tests
}
/**
* @test
* @define-env usesSqliteConnection
*/
public function it_can_be_connected_with_sqlite()
{
// write your tests
}
}
Application Key
Most applications would require APP_KEY
to be defined in order to use encryption:
<phpunit>
// ...
<php>
<env name="APP_KEY" value="AckfSECXIvnK5r28GVIWUAxmbBSjTsmF"/>
</php>
</phpunit>
Application Timezone
You can also easily override the application's default timezone, instead of the default "UTC"
:
class TestCase extends \Orchestra\Testbench\TestCase
{
/**
* Get the application timezone.
*
* @param \Illuminate\Foundation\Application $app
* @return string|null
*/
protected function getApplicationTimezone($app)
{
return 'Asia/Kuala_Lumpur';
}
}
Using .env
Environment Variables
By default, Testbench will load .env
file when booting the application if the file exists. You can change to completely ignores .env
file by setting TestCase::$loadEnvironmentVariables
property to false
:
class TestCase extends \Orchestra\Testbench\TestCase
{
/**
* Automatically loads environment file if available.
*
* @var bool
*/
protected $loadEnvironmentVariables = false;
//
}