Имитация fails() и make() объекта Validator

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

$validator = Validator::shouldReceive('make')
    ->once()
    ->with([], $this->rules);

$validator->shouldReceive('fails')
    ->once()
    ->andReturn(true);

И

$validator = Validator::shouldReceive('make')
    ->once()
    ->with([], $this->rules)
    ->shouldReceive('fails')
    ->once()
    ->andReturn(true);    

С обоими из них я затем устанавливаю свойство валидатора в классе для объекта, возвращающегося из насмешек.

Функция, которую я пытаюсь проверить, выглядит так

class JsonModel extends Model
{

    private $validator;

    public function createFromJSON(array $inputData, $throwException = false)
    {
        // This calls Validator::make
        $this->makeValidator(
            $inputData, 
            $this->getValidationRules() // An internal function that returns the rules for the Model
        );

        if($this->validator->fails()) {
             if($throwException === true) {
                 throw new Exception('Validation failed');
             } else {
                 return null;
             }
         }
        return null;

        /** @var Model $model */
        $model = self::create($inputData);
        return $model;
    }

    private function makeValidator($inputData, $ruleData)
    {
        $this->validator = Validator::make($inputData, $ruleData);
    }
}

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


person Catharsis    schedule 24.07.2015    source источник
comment
Мы можем увидеть makeValidator, пожалуйста? Вы теряете меня с обоими из них, затем я устанавливаю свойство валидатора в классе для объекта, возвращающегося из насмешек.   -  person deefour    schedule 24.07.2015
comment
Я не понимаю, как вы создаете макеты: $validator = Validator::shouldReceive('make')   -  person gontrollez    schedule 24.07.2015
comment
@gontrollez - это я понял из документации Laravel 5, что это было, как издеваться над валидатором.   -  person Catharsis    schedule 25.07.2015


Ответы (1)


Итак, я нашел ответ после долгих возни. Все дело в том, как вы вызываете валидатор. Я решил изменить функцию так, чтобы все, что она делала, — это валидация объекта с использованием набора правил. Итак, теперь я возвращаю результат passes() вместо fails(). Для всех, кто пытается издеваться над этим, нижеследующее должно помочь вам.

public function testWithMockValidator()
{
    // Mock the function you wish to mock and the result
    $mockValidator = \Mockery::mock('\Illuminate\Validation\Validator');
    $mockValidator->shouldReceive('passes')
        ->once()
        ->andReturn(false);

    // Then Mock the factory that will be used to create the validator
    $factory = '\Illuminate\Validation\Factory';

    $mockFactory = \Mockery::mock($factory);
    $mockFactory->shouldReceive('make')
        ->once()
        ->andReturn($mockValidator);

    // Register the mock with the app
    \App::instance($factory, $mockFactory);

    // Create the object I need
    $obj = \Mockery::mock(self::CLASS_NAME)->makePartial();

    // Set a property using reflection
    $property = UTH::i()->makePropertyAccessible(
        self::CLASS_NAME,
        self::PROP_VALIDATION_RULES
    );
    $property->setValue($obj, $this->rules);

    // call my function (which has been renamed and redesigned to just validate the model
    $return = $obj->validate(['foo' => true]);

    // $return will be whatever you set it to in the mock above
    $this->assertFalse($return);
}

Вот функция в тестируемом классе

public final function validate(array $inputData)
{
    $factory = \App::make('\Illuminate\Validation\Factory');
    // This retrieves the private property
    $rules = $this->getValidationRules();

    $this->validator = $factory->make($inputData, $rules);

    return $this->validator->passes();
}
person Catharsis    schedule 26.07.2015