2016-03-24 50 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

問題是該方法確實存在於模擬對象上,並且它表示它沒有。 –

相關問題