Я использую Laravel 7 и пытаюсь частично имитировать красноречивую модель ..
В мой контроллер введена красноречивая зависимость модели:
use App\Models\Ticket;
class TicketsController extends Controller
{
/** @var Ticket */
private $tickets;
public function __construct(Ticket $ticket) {
$this->tickets = $ticket;
}
public function get() {
$tickets = $this->tickets::whereNull('staff_id')
->where('status', '!=', $this->tickets::STATUS_CLOSED)
->orderBy('created_at', 'desc')
->get();
}
}
Модульный тест:
use App\Models\Ticket;
$this->partialMock(Ticket::class, function($mock) {
$mock->shouldReceive('get')
->once()
->andReturn([]);
});
$response = $this->json('get', route('tickets'));
$response->assertOk();
Сбой с:
тестирование. ОШИБКА: Получен Mockery_0_App_Models_Ticket :: __ construct (), но никаких ожиданий не было указано {"исключение": "[объект] (Mockery \ Exception \ BadMethodCallException (code: 0): Получен Mockery_0_App_Models_Ticket :: __ construct (), но в /opt/project/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(34): eval () ' d код: 911)
Также пытался изменить тест для этого:
$ticketsMock = Mockery::mock(Ticket::class);
$ticketsMock
->makePartial()
->shouldReceive('get')
->once()
->andReturn([]);
$this->instance(Ticket::class, $ticketsMock);
Но получаю точно такую же ошибку ..
Если я заменю mock на non частичный и подделать все вызовы методов в модели, которая работает нормально ... но некоторые красноречивые запросы будут довольно длинными, и я пытаюсь сделать это с помощью частичного макета, поэтому мне не нужно подделывать каждый связанный вызов, например ->shouldReceive('something')->andReturnSelf()