Как имитировать правило валидации в LaravelPhp

Кемеровские программисты php общаются здесь
Anonymous
Как имитировать правило валидации в Laravel

Сообщение Anonymous »

Я хочу имитировать пользовательское правило проверки (например, App\Rules\SomeRule). Но когда я запускаю свой тест, он выдает Mockery\Exception\InvalidCountException: метод... следует вызывать
ровно 1 раз, но вызывать 0 раз.

Я прочитал документацию Laravel о насмешках, о пользовательских правилах проверки, сервисных контейнерах и поставщиках услуг, и я не могу понять, почему мне не удается успешно имитировать это правило.

Я прочитал эту тему, но изо всех сил пытаюсь связать ее со своей проблемой: «Как я могу проверить, что мое приложение использует это правило». Или я не могу это проверить?

Вот мое правило

Код: Выделить всё

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class SomeRule implements Rule
{

public function passes($attribute, $value)
{
// some logic, returns TRUE if valid.
}

public function message()
{
//
}
}
Мой контроллер

Код: Выделить всё

namespace App\Http\Controllers;

use App\Rules\SomeRule;
use Illuminate\Http\Request;

class LoanController extends Controller
{
public function store(Request $request)
{
$request->validate([
'email' => ['required', new SomeRule]
]);

// ...insert in database, return json.
}
}
Мой тест

Код: Выделить всё

namespace Tests\Feature;

use Mockery;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Rules\SomeRule;

class LoansTest extends TestCase
{
use RefreshDatabase;

public function tearDown(): void
{
parent::tearDown();
Mockery::close();
}

/** @test */
public function the_sad_path__when_email_is_invalid()
{

$rule = Mockery::mock(SomeRule::class)->shouldReceive('passes')->once();
$this->app->instance(SomeRule::class, $rule);

$response = $this->json('POST', '/api/loans', ['email' => 'whatevs@gmail.com']);
}
}
Я обдумывал идею регистрации SomeRule в AppServiceProvider. Но это все равно ничего не дало:

Код: Выделить всё

    public function register()
{
$this->app->bind(SomeRule::class, function ($app) {
return new SomeRule();
});
}
Код на Github

Подробнее здесь: https://stackoverflow.com/questions/573 ... in-laravel

Вернуться в «Php»