模拟不执行模拟方法

时间:2019-02-01 17:39:57

标签: unit-testing laravel-5 mockery

我的类名为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则调用resample。现在,我想运行模拟验证器。但是它调用了真正的方法。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

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();
   }
}