1
我現在被困在Laravel 4.2中(與phpunit和嘲笑),但同樣應該適用於更高版本。在Laravel中,模擬一個模型的雄辯查詢
我有一個知識庫用於我的FxRate
模型。它有一個方法來獲得的外匯匯率VS GBP包含此雄辯電話:
$query = \FxRate::where('currency', $currency)
->where('fx_date', $fxDate->format('Y-m-d'))
->first();
return $query->rate_to_gbp;
在我的單元測試,我想嘲笑這個電話,所以我可以定義將通過此調用返回的查詢結果而不是依靠數據庫來實現其中的價值。
我的嘗試是這樣的:
$mocked_query_result = (object) ['rate_to_gbp' => 1.5];
FxRate::shouldReceive('where')
->once()
->andReturn($mocked_query_result);
但我相當肯定這不會是最初的靜態調用FxRate
應該返回接受進一步where()
調用和first()
一些查詢對象工作。
有沒有嘲笑他的乾淨的方式?
[該文檔(http://laravel.com/docs/4.2/testing#mocking-facades)說這是可能嘲笑門面;這不是問題 - 我很高興在這種情況下使用外觀。難度是鏈式方法,看起來好像我需要爲鏈中的每個方法返回一個新的模擬對象。 – harryg
@harryg - 找到了你。我在編輯中採取了這種方法。也許不是最好的,所以有人可能會提出其他建議。有一個Mockery :: self()對象返回,但我有問題讓它工作,從來沒有堅持下去,所以值得一看。 – markdwhite
嗯,我真不知道該作品爲'FxRate ::其中(...)'不返回FxRate'的'一個實例;它返回一個'Illuminate \ Database \ Eloquent \ Builder'實例,它接受進一步鏈接的方法。 'first()'然後返回結果。 – harryg