2016-03-24 53 views
1

所以我有一个对象,我嘲笑,它有用于发送电子邮件的方法。我已经从一个静态类转变为一个具体类,因为我遇到了用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'); 

回答

0

你如何创建$this->mailer?为了能够使用间谍功能->shouldHaveReceived,您需要在使用Mockery::mock($className)创建测试双精度后调用Mockery::spy($className)或称为shouldIgnoreMissing方法。

+0

我已经更新了我的帖子,上面显示了我是如何创建模拟对象的,虽然在研究这个问题时我还没有看到有关间谍方法的任何内容,我将不得不考虑这一点。除了我上面发布的(编辑过的)意思是通过实例方法将模拟添加到laravel应用程序之外,我还没有看到任何其他内容。 –

+0

问题是该方法确实存在于模拟对象上,并且它表示它没有。 –

相关问题