Я хочу проверить, что 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')
, тест все равно не будет пройден.
Как правильно протестировать этот фрагмент кода?