所以我有一个我正在模拟的对象,它有用于发送电子邮件的方法。我已经从一个静态类转到了一个具体类,因为我在使用 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
方法的类,也没有在该类上定义该方法。
然而,你可能知道也可能不知道 Eloquent 模型实际上使用了魔法___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');