Можно ли смоделировать или подделать вывод метода модели в Laravel 5.8?
Например, рассмотрим эту модель
class Website extends Model
{
public function checkDomainConfiguration($domain): bool
{
try {
$records = dns_get_record($domain, DNS_A);
} catch (ErrorException $e) {
return false;
}
if (isset($records[0]['ip']) && $records[0]['ip'] === $this->server->ipv4_address) {
return true;
}
return false;
}
}
для целей теста мне нужно сообщить phpunit, что когда этот метод запускается (он вызывается в контроллере), возвращать true или false, если я намеренно хочу, чтобы он потерпел неудачу. В тесте я заводил веб-сайт, и, конечно, он потерпит неудачу с помощью метода php dns_get_record
.
Я прочитал документы Laravel и отыскивал в Google информацию о методах насмешливой модели, но, похоже, не могу найти ничего, кроме как обернуть большую if
вокруг метода, который проверяет, не нахожусь ли я в режиме тестирования, и если я просто верну истину. <- ЮК. </p>
UPDATE
Это пример того, как я вызываю метод в контроллере
class SomeController extends Controller
{
public function store(Website $website, Domain $domain)
{
if (! $website->checkDomainConfiguration($domain->domain)) {
return response([
'error' => 'error message'
], 500);
}
// continue on here if all good.
}
}
Это код из теста
$website = factory(Website::class)->create();
$domain = factory(Domain::class)->create([
'website_id' => $website->id
]);
//Mock the website object
$websiteMock = \Mockery::mock(Website::class)->makePartial();
$websiteMock->shouldReceive('getAttribute')
->once()
->with('domain')
->andReturn($website->domain);
$websiteMock->shouldReceive('checkDomainConfiguration')
->with($domain->domain)
->andReturn(true);
app()->instance(Website::class, $websiteMock);
// tried end point like this
$response = $this->json(
'POST',
'api/my-end-point/websites/' . $website->domain . '/domain/' . $domain->id
);
//also tried like this
$response = $this->json(
'POST',
'api/my-end-point/websites/' . $websiteMock->domain . '/domain/' . $domain->id
);
Метод контроллера принимает привязки веб-сайта и модели домена. если я dd(get_class($website))
вверху контроллера, он отображает пространство имен для фактической модели, а не макет.