Потому что вы попросили Laravel волхвов c ... Вот так. Вероятно, чрезмерное и чрезмерное решение.
Давайте сначала создадим интерфейс, единственной целью которого является определение функции, которая возвращает строку подключения.
app / Connection. php
namespace App;
interface Connection
{
public function getConnection();
}
Тогда давайте создадим конкретную реализацию, которую мы сможем использовать в реальном мире (производство).
app / GlobalConnection. php
namespace App;
class GlobalConnection implements Connection
{
public function getConnection()
{
return 'global-connection';
}
}
И еще одна реализация, которую мы можем использовать в наших тестах.
app / TestingConnection. php (вы также можете поместить это в свой tests
директории, но обязательно измените пространство имен на соответствующее)
namespace App;
class TestingConnection implements Connection
{
public function getConnection()
{
return 'testing-connection';
}
}
Теперь давайте go вперед и скажем Laravel, какую конкретную реализацию мы хотим использовать по умолчанию. Это можно сделать, перейдя в файл app/Providers/AppServiceProvider.php
и добавив этот бит в метод register
.
app / Providers / AppServiceProvider. php
namespace App\Providers;
use App\Connection;
use App\GlobalConnection;
// ...
public function register()
{
// ...
$this->app->bind(Connection::class, GlobalConnection::class);
// ...
}
Давайте использовать его в нашей модели.
app / SomeModel. php
namespace App;
use Illuminate\Database\Eloquent\Model;
class SomeModel extends Model
{
public function __construct(Connection $connection, $attributes = [])
{
parent::__construct($attributes);
$this->connection = $connection->getConnection();
}
// ...
}
Почти там. Теперь в наших тестах мы можем заменить реализацию GlobalConnection
реализацией TestingConnection
. Вот как.
tests / Feature / ExampleTest. php
namespace Tests\Feature;
use Tests\TestCase;
use App\Connection;
use App\TestingConnection;
class ExampleTest extends TestCase
{
public function setUp(): void
{
parent::setUp();
$this->app->instance(Connection::class, TestingConnection::class);
}
/** @test */
public function your_test()
{
// $connection is 'testing-connection' in here
}
}
Код не проверен, но должен работать. Вы также можете создать фасад для статического доступа к методу, а затем использовать Mockery, чтобы смоделировать вызов метода и вернуть нужную строку соединения во время тестирования.