Laravel 的嘲弄不会模拟方法

Posted

技术标签:

【中文标题】Laravel 的嘲弄不会模拟方法【英文标题】:Mockery with Laravel don't mocks a method 【发布时间】:2018-04-05 00:48:17 【问题描述】:

我使用 Laravel 5.5 并尝试模拟一个类的公共方法,该方法在这个类中使用:

class ToTest 
  public function filters() 
    return 'original';
  

  public function callMe() 
    return $this->filters();
  

这是我的测试代码:

public function it_should_call_bla_bla()

  $mock = $this->mock(ToTest::class);
  $mock->shouldReceive('filters')->andReturn('not orignial');

  $toTest = app(ToTest::class);
  print_r($toTest->callMe());


private function mock($class)

  $mock = Mockery::mock(app($class))->makePartial();

  $this->app->instance($class, $mock);

  return $mock;

$toTest->callMe() 返回original...

【问题讨论】:

【参考方案1】:

问题是,你用一个对象而不是一个类来创建你的模拟,正确的代码,以满足你的要求是这样的:

        $mock = Mockery::mock($class)->makePartial();

发生的事情是你在嘲笑对象。当 ToTest 对象已经初始化时,模拟只覆盖了 filters 方法,而 callMe 保持不变。如果您尝试使用旧代码转储print_r($toTest->filters());,它将返回"not original"

【讨论】:

以上是关于Laravel 的嘲弄不会模拟方法的主要内容,如果未能解决你的问题,请参考以下文章

laravel 4 嘲弄模拟模型关系

嘲弄,App Instance 在某些 laravel 测试中不起作用

用嘲弄来测试 Laravel 外观总是通过,即使它应该失败

嘲弄模拟不返回指定值

在 Laravel 中模拟具有关系的模型

在 Laravel 中模拟具有关系的模型