Этот ответ ниже был написан в предположении, что openssl-random-pseudo-bytes принимает два неизменных аргумента.Вместо этого второй аргумент передается по ссылке и дает обратную связь, если случайные байты были созданы сильным алгоритмом.Учитывая эту информацию, ответ, предоставленный Робби Аверилл , является верным подходом, поскольку приходится иметь дело в основном с двумя операторами возврата и побочным эффектом, который по своей сути усложняет юнит-тестирование.
Вам не нужно исключение безопасности в вашем случае.
Вы хотите заключить openssl_random_pseudo_bytes
в свою собственную пользовательскую функцию и хотите жестко закодировать длину до 16 символов и всегда вызывать openssl_random_pseudo_bytes
с true
.Следовательно, вы можете написать свой класс как:
class MyClass
{
public function generateRandomBytes()
{
return openssl_random_pseudo_bytes(16, true);
}
}
Единственный значимый тест здесь - это проверить, что длина возвращаемой строки составляет 16 символов.И вы рассмотрели этот случай.
Чтобы показать ненужность создания исключения, вы бы предпочли добавить флаг в конструктор или в качестве параметра:
class MyClass
{
/**
* @var bool
*/
private $beSecure;
public function __construct(bool $beSecure)
{
$this->beSecure = $beSecure;
}
/**
* @return string
* @throws Exception
*/
public function generateRandomBytes(): string
{
if (!$this->beSecure) {
// will always throw if false is injected, why would we do that?
throw new Exception("I AM NOT SECURE!");
}
return openssl_random_pseudo_bytes(16, true);
}
}
В ваших модульных тестах вы можете теперь создать два теста, один для защищенного случая и один для небезопасного случая, но зачем вам когда-нибудь внедрять false в этот класс?Тогда он всегда будет терпеть неудачу.