Насмешливый Laravel пользовательский класс правил проверки не работает - PullRequest
0 голосов
/ 22 января 2020

Я внедряю новое пользовательское правило проверки в форму отправки. Но я хочу обойти правило проверки в модульном тестировании. Ниже приведено упрощенное правило валидации и класс модульного тестирования. Чего мне не хватает?

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Captcha implements Rule
{
    public function passes($attribute, $value)
    {
        // assuming will always return false in testing
        // works fine when true
        return false; 
    }

    public function message()
    {
        return 'Captcha error! Try again later or contact site admin.';
    }
}
use Tests\TestCase;
use App\Rules\Captcha;

class RegistrationTest extends TestCase {

    public test_user_registration()
    {
        $this->mock(Captcha::class, function ($mock) {
            $mock->shouldReceive('passes')->andReturn(true);
        });

        $response = $this->post(route('tenant.register'), [
            'g-recaptcha-response' => 1,
            'email' => 'user@example.com',
            'password' => 'secret',
        ]);

        $this->assertEquals(1, User::all()->count());
     }
} 

РЕДАКТИРОВАТЬ: также включены FormRequest и Controller файл

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Captcha;

class NewUserRequest extends FormRequest {

    public function rules()
    {
        return [
            'name' => ['required', new Captcha]
        ];
    }
}
...

public function postRegister(NewUserRequest $request) {

...

РЕДАКТИРОВАТЬ II: похоже на ошибку в Laravel сама;

пробовал предоставленные решения, но все еще не работает

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Класс должен быть создан через служебный контейнер Laravels, чтобы его можно было смоделировать. Лучший способ выполнить sh это (в этой ситуации) - просто изменить new Captcha на app(Captcha::class):

пространство имен App \ Http \ Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Captcha;

class NewUserRequest extends FormRequest {

    public function rules()
    {
        return [
            'name' => ['required', app(Captcha::class)]
        ];
    }
}

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

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

В течение долгого времени похоже на существующую ошибку в Laravel, поэтому обходной путь - не использовать Mock. Поэтому я буду просто обходить класс Rule, когда присутствует окружение testing.

if (app()->environment() === 'testing')
    return true;
...