Laravel 7 - Как перепривязать репозиторий в Validator :: extend () для тестов? - PullRequest
1 голос
/ 27 марта 2020

Я установил пользовательское правило проверки, например, так:

// Пользовательский созданный RepositoryProvider. php также зарегистрирован в приложении. php Массив 'provider'.

public $bindings = [
    UserRepository::class => EloquentUserRepository::class,
];

public function boot(UserRepository $userRepository)
{
    Validator::extend('user_email_unique', function($attribute, $value, $parameters) use($userRepository) {
        return !$userRepository->findByEmailAddress($value)->exists();
    });
}

// мой тест

class SignUpUserActionTest extends TestCase
{
    public function setUp() : void
    {
        parent::setUp();

        $this->app->bind(UserRepository::class, function() {
            return new UserRepositoryMock();
        });
    }
}

В моем тесте я привязываю UserRepository к макету. Он отлично работает для извлечения данных, но поддерживает первоначальную привязку для расширения проверки и не перепривязывает используемый репозиторий. Поэтому при запуске модульных тестов они используют две разные реализации.

Как можно расширить валидатор, чтобы автоматическое разрешение c восстанавливалось при тестировании?

Спасибо.

1 Ответ

0 голосов
/ 27 марта 2020

Поскольку вы регистрируете c в своем RepositoryProvider, это будет реализовано в вашем вызове parent::setUp() и, таким образом, вызовет ваш UserRepository до того, как привязка будет проверена. Переместите привязку перед этим вызовом, и я предполагаю, что вы получите другой результат.

public function setUp() : void
{
    $this->app->bind(UserRepository::class, function() {
        return new UserRepositoryMock();
    });

    parent::setUp();
}

РЕДАКТИРОВАТЬ

Основываясь на вашем комментарии, причина была правильной, решение не было. Разрешение UserRepository в закрытии, скорее всего, разрешит его в то время, когда установлена ​​привязка.

Validator::extend('user_email_unique', function($attribute, $value, $parameters) {
    $userRepository = resolve(UserRepository::class);
    return !$userRepository->findByEmailAddress($value)->exists();
});
...