所以我有一个对象,我嘲笑,它有用于发送电子邮件的方法。我已经从一个静态类转变为一个具体类,因为我遇到了用Mockery测试静态类的问题。Mockery:方法不存在模拟对象
但是,我现在发现,当一个雄辩的模型被保存时,它会抛出一个事件,触发一个监听器。这个监听器负责启动对模拟对象方法的调用。
我发现,当我做下面的工作时,它会起作用。
$model = factory(MyClass::class)->make();
$model->property = 'value';
$model->save()
$this->mailer->shouldHaveReceived('methodName')->with($arg1, $arg2, $arg3);
它会抱怨方法不模仿对象上存在每一次失败,最糟糕的是,如果我进入我的听众,其中模拟对象的方法被调用,我做这样的事情
echo '<pre>'.print_r(get_class_methods($this->mailer), true).'</pre>'; exit;
它表明该方法实际上是从get_class_methods返回的方法数组中。
现在,这里是踢球者。一切都完美的作品,并测试通过没有任何错误,如果我做到以下几点:
$this->mailer->shouldReceive('methodName');
$model = factory(MyClass::class)->make();
$model->property = 'value';
$model->save()
现在,我一直在阅读的Mockery Gotchas并且它会出现,如果我的类是调用方法,真正没有对存在通过___call
对象,那么这个错误是可以预料的。
但是,我的邮件类没有扩展任何其他类,它将有一个__call
方法,也没有该类定义的方法。
但是,正如你可能或可能不知道雄辩模型实际上使用魔术___call
方法。然而,我不是用Mockery模拟模型,我在Laravel中使用工厂模型,但我也没有检查模型对象的方法调用,我正在检查我的具体邮件类的方法调用。
任何人都知道为什么我可能从Mockery获得这种行为?
我创造我的模拟对象在Laravel 5.2用下面的代码
public function mock($class)
{
$mock = Mockery::mock($class);
$this->app->instance($class, $mock);
return $mock;
}
$this->mailer = $this->mock('Namespace\Classname');
我已经更新了我的帖子,上面显示了我是如何创建模拟对象的,虽然在研究这个问题时我还没有看到有关间谍方法的任何内容,我将不得不考虑这一点。除了我上面发布的(编辑过的)意思是通过实例方法将模拟添加到laravel应用程序之外,我还没有看到任何其他内容。 –
问题是该方法确实存在于模拟对象上,并且它表示它没有。 –