Краткое введение, чтобы дать вам представление о том, чего я хочу достичь ...
У меня есть команда Laravel 5.6 artisan, которая вызывает внешний API с простым GET-запросом для получения некоторых данных. Я хочу проверить это без физического вызова API . (Я хочу быть в автономном режиме и все еще иметь тестовый зеленый тест).
Теперь краткое объяснение того, как устроена логика.
1) Эта команда ремесленника (php artisan export:data
) имеет свой собственный конструктор (__construct
), куда я добавляю кучу вещей. Одна из вещей, которые я ввожу, это класс ExportApiService
. Легко.
public function __construct(
ExportApiService $exportApiService,
) {
parent::__construct();
$this->exportApiService = $exportApiService;
}
2) Теперь ExportApiService
расширяется abstract class AbstractApiService
. Внутри этого абстрактного класса я создал конструктор, в котором я просто внедряю GuzzleHttp\Client
в свойство $client
, чтобы в ExportApiService
я мог вызывать API с помощью $this->client
. Легко.
3) Так что у моего ExportApiService
есть метод с именем exportData
. Trivial. Работает.
public function exportData(array $args = []): Collection
{
$response = $this->client->request('GET', 'https://blahblah.blah');
return collect(json_decode($response->getBody()->getContents(), true));
}
4) Итак, наконец, в моей команде ремесленников (которую я ввел в пункте № 1) я вызываю:
public function handle()
{
$exportedData = $this->exportApiService->exportData($this->args);
$this->info('Exported ' . count($exportedData) . ' records');
}
Я хочу проверить, соответствует ли вывод моим ожиданиям , не вызывая этот внешний API вообще . Я хочу как-то поиздеваться ...
public function testExportSuccessful()
{
$this->console->call('export:data', [$some_arguments]);
$output = $this->console->output();
$this->assertContains('Exported 123 records', $output); // this does not work :(
}
Теперь мой точный вопрос - как я могу заставить Laravel / PHPUnit возвращать фиксированное значение каждый раз, когда команда ремесленника будет вызывать exportData()
?
Что вы пробовали?
Я попытался создать метод setUp()
со следующим кодом:
public function setUp()
{
parent::setUp();
$mock = $this->createMock(ExportApiService::class);
$mock->method('exportData')->willReturn(123); // give me a dummy integer each time exportData is being called so that I can use is in the assert at the end
}
Но это совсем не работает, хотя для меня это имеет смысл.
Спасибо за любую помощь.