Как я могу проверить, что объект создан с правильными параметрами конструктора из фабрики в PHP? - PullRequest
1 голос
/ 18 апреля 2020

Я хочу проверить, что API создан правильно с завода ниже. В API нет ни методов получения, ни публикаций c ни для одного из переданных параметров конструктора, однако корректность уже проверена в тесте для самого API. Я просто хочу проверить фабрику, что она передает правильные параметры конструктора в API.

Требуется следующее:

  • Я хочу убедиться, что API создан с $client вводится в конструктор вместе с $language, $appid и $syscode5, переданными в метод, если они указаны.
  • Если не указан ни один из $appid и $syscode5 он вызывает другой метод publi c класса getSecret(), который попытается получить значения. Этот метод заглушается при тестировании на заводе. Я хочу убедиться, что фабрика передает значения из метода в конструкторе $appid и $syscode5 параметров при создании API.
class ApiFactory {
    public function __construct(ClientInterface $client) {
        $this->client = $client;
    }

    public function __invoke(int $language = Api::TRADITIONAL_CHINESE, ?string $appid = NULL, ?string $syscode5 = NULL) {
        $secret = NULL;
        if ($appid === NULL || $syscode5 === NULL) {
            $secret = $this->getSecret();
        }
        return new Api($this->client, $appid ?? $secret->appid, $syscode5 ?? $secret->syscode5, $language);
    }

    public function getSecret() : stdClass {
        // omitted
    }

    /**
     * @var ClientInterface
     */
    private $client;
}

Я не могу придумать способ убедитесь, что конструктор вызывается с правильными значениями. Самое близкое, что я могу сделать, - это реорганизовать фактическую конструкцию нового защищенного метода с именем makeApi с точно такой же сигнатурой с конструктором в IUT и смоделировать его в модульных тестах.

    public function __invoke(int $language = Api::TRADITIONAL_CHINESE, ?string $appid = NULL, ?string $syscode5 = NULL) {
        $secret = NULL;
        if ($appid === NULL || $syscode5 === NULL) {
            $secret = $this->getSecret();
        }
        return $this->makeApi($this->client, $appid ?? $secret->appid, $syscode5 ?? $secret->syscode5, $language);
    }

    protected function makeApi(
        ClientInterface $client
        , string $appid
        , string $syscode5
        , int $language = Api::TRADITIONAL_CHINESE
        , ?string $baseUrl = NULL
    ) : Api {
        return new Api($client, $appid, $syscode5, $language, $baseUrl);
    }

Однако, новый защищенный метод остается непроверенным. Если его заменить другими возвращаемыми значениями, такими как new Api(new Client(), '', '', 5, 'http://example.com'), тест все равно не будет пройден.

Как правильно протестировать этот фрагмент кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...