Я застрял на Laravel 4.2 сейчас (с phpunit и насмешкой), но то же самое относится к более поздним версиям.В Laravel, высмеивая красноречивый запрос по модели
У меня есть репозиторий для моей модели FxRate
. Он имеет метод, чтобы получить скорость FX против 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 :: where (...)' не возвращает экземпляр 'FxRate'; он возвращает экземпляр 'Illuminate \ Database \ Eloquent \ Builder', который принимает дальнейшие цепные mothods. 'first()' затем возвращает результат. – harryg