Издевательство не выполняет ложный метод - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть имя класса Validator, и у него есть метод forVote.Это мой код.

public function test_should_set_default()
    {
        $this->mock = \Mockery::mock(Validator::class);
        $this->mock->shouldReceive('forVote')
            ->andReturnTrue();
        $this->app->instance(Validator::class,$this->mock);
        $factory = new Factory();
        $this->assertTrue($factory->setDefault());
    }

Итак, Factory звонит Processor, что звонит Validator.Теперь я хочу запустить фиктивный валидатор.Но он вызывает реальный метод.

Что я делаю не так?

1 Ответ

0 голосов
/ 02 февраля 2019

https://laravel.com/docs/5.6/container#introduction

, так как хранилище внедряется, мы можем легко поменять его с другой реализацией.Мы также можем легко «насмехаться» или создавать фиктивную реализацию UserRepository при тестировании нашего приложения.

Я полагаю, что вы, возможно, в настоящее время создаете свои зависимости следующим образом:

$processor = new Processor() и $validator = Validator::make(...);

Итак, чтобы использовать ваш макетируемый класс, вы должны использовать внедрение зависимостей, которое просто означает, что ваши классы должны внедрить ваши зависимости с помощью метода __construct.

Ваш класс Factory должен быть таким:

class Factory {

   $processor;

   public function __construct(Processor $processor)
   {
       $this->processor = $processor;
   }

   public function setDefault()
   {
       $this->processor->callingValidator();
   }
}

, а ваш Processor должен быть таким:

class Processor {

   $validator;

   /**
    * The Validator will resolve to your mocked class.
    *
    */
   public function __construct(Validator $validator)
   {
       $this->validator = $validator;
   }

   public function callingValidator()
   {
       $this->validator->make();
   }
}
...