Модель Mocking Eloquent с Mockery на Laravel (люмен) не работает - PullRequest
1 голос
/ 28 января 2020

Довольно плохо знаком с PHP, так что простите, если я пропустил что-то очевидное.

В настоящее время я использую Lumen (который в основном является базовым c Laravel, только с основными зависимостями) и Eloquent для управления постоянными сущностями.

Я хочу написать модульный тест, в котором мне нужно вызвать функцию, которая в какой-то момент выполняет Eloquent запрос, подобный следующему:

$errorMailRecipients = User::where('id_role',  1)
        ->where('some_value', 1)
        ->whereNotNull('email_addr');

Мой пользователь. class, это базовая c Eloquent сущность:

    class User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject
    {
       use Authenticatable, Authorizable, Eloquence, Mappable;

       const CREATED_AT = 'creation_date';
       const UPDATED_AT = 'modification_date';

       /** Eloquent model configuration */
       protected $connection = 'database_name';
       protected $table = 'user';
       protected $primaryKey = 'id';

      // other stuff mapping, functions, etc ...
}

Итак, я создал тест и пытался, с помощью насмешки, смоделировать этот конкретный c запрос:

class ImportTest extends TestCase
{

    public function test_should_send_error_mail_when_receiving_empty_request()
    {
        // Given
        $controller = new ImportController();

        $mockedRecipients = // <- some Collection containing static data
        $mock = Mockery::mock(User::class, function ($mock) use ($mockedRecipients) {
            $mock->shouldReceive('where')->once()->andReturn($mockedRecipients);
        });
        $this->app->instance('App\Models\User', $mock);

        // When
        $controller->importDevices(new Request());

        // Then
    }
 }

Я перепробовал много вариантов и разложить насмешки на несколько строк:

    $mock = Mockery::mock(User::class);
    $this->app->instance('User', $mock);
    $mock->shouldReceive('where')->once()->andReturn($mockedRecipients);

Также попытался удалить -> Once () и прочитал следующие руководства:

Но до сих пор у меня возникала следующая ошибка при выполнении PHP Модульный тест:

Подсветка \ База данных \ QueryException: SQLSTATE [HY000] [2002] Соединение отклонено ...

Потому что вы ах, у меня нет локальной базы данных, и она все еще пытается поразить ее. Какие-нибудь мысли ? Спасибо

1 Ответ

0 голосов
/ 29 января 2020

Я обнаружил, что я делаю неправильно, благодаря @mrhn;)

Насмешка позволяет использовать псевдонимы для насмешливых функций c stati c, я не знал, что будет разница first:)

Просто заменив Mockery::mock('\App\Models\User'); на Mockery::mock('alias:\App\Models\User');, добился цели.

Таким образом, не рекомендуется использовать это, поэтому я думаю, что буду продолжать учиться во время написания тестов. Поскольку у нас скоро будет цепочка CI, использующая непосредственно MySQL экземплярную базу данных для работы с нашим приложением, и, поскольку оператор @mrhn пойдет по этому пути, я рассмотрю возможность выполнения реальных вызовов базы данных в будущем.

...