所以我有一個對象,我嘲笑,它有用於發送電子郵件的方法。我已經從一個靜態類轉變爲一個具體類,因爲我遇到了用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應用程序之外,我還沒有看到任何其他內容。 –
問題是該方法確實存在於模擬對象上,並且它表示它沒有。 –