Laravel / PHPUnit: класс не подвергается насмешкам при запуске тестов - PullRequest
0 голосов
/ 09 сентября 2018

Я тестирую класс, который вызывает пользовательскую службу и хочет смоделировать ее.

Ошибка:

App\Jobs\CustomApiTest::getrandomInfo
Error: Call to a member function toArray() on null

Это потому, что в getrandomInfo() есть вызов базы данных для получения идентификатора, и тестовая база данных в настоящее время возвращает ноль, потому что нет записи, но тест никогда не должен заходить так далеко, потому что я высмеиваю getData функция.

Конфигурация машины:

Laravel 5.2

PHPUnit 4.8

Я не могу обновить свою конфигурацию.

MainClass.php

namespace App\Jobs;
use App\Services\CustomApi;

class MainClass
{
    public function handle()
    {
        try {
            $date = Carbon::yesterday();
            $data = (new CustomApi($date))->getData();
        } catch (Exception $e) {
            Log::error("Error, {$e->getMessage()}");
        }
    }
}

MainClassTest.php

nameSpace App\Jobs;
use App\Services\CustomApi;
class MainClassTest extends \TestCase
{
    /** @test */
    public function handleGetsData()
    {
    $data = json_encode([
            'randomInfo' => '',
            'moreInfo' => ''
        ]);
    $customApiMock = $this->getMockBuilder(App\Services\CustomApi::class)
            ->disableOriginalConstructor()
            ->setMethods(['getData'])
            ->getMock('CustomApi', ['getData']);
        $customApiMock->expects($this->once())
            ->method('getData')
            ->will($this->returnValue($data));

        $this->app->instance(App\Services\CustomApi::class, $customApiMock);

    (new MainClass())->handle();
    }
}

CustomApi Snippet

namespace App\Services;
class CustomApi
{
    /**
     * @var Carbon
     */
    private $date;

    public function __construct(Carbon $date)
    {
        $this->date = $date;
    }

    public function getData() : string
    {
        return json_encode([
            'randomInfo' => $this->getrandomInfo(),
            'moreInfo' => $this->getmoreInfo()
        ]);
    }
}

Я пробовал много вариантов приведенного выше кода, включая:

Not using `disableOriginalConstructor()` when creating $externalApiMock.
Not providing parameters to `getMock()` when creating $externalApiMock.
Using `bind(App\Services\CustomApi::class, $customApiMock)` instead of instance(App\Services\CustomApi::class, $customApiMock) for the app.
Using willReturn($data)`` instead `will($this->returnValue($data))`.

1 Ответ

0 голосов
/ 11 сентября 2018

Я закончил тем, что создал поставщика услуг и зарегистрировал его в файле app.php. Казалось, что приложение не сохраняет экземпляр в контейнерах, а работает, когда оно привязано к службе.

...