Как вернуть разные значения из фиктивного объекта в зависимости от параметраPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как вернуть разные значения из фиктивного объекта в зависимости от параметра

Сообщение Anonymous »

Я хочу имитировать возвращаемые значения сервера Redis. В зависимости от ключа мне нужно вернуть разные поддельные значения.
Поскольку это все равно было бы легко, я хочу, чтобы в качестве возвращаемого значения было содержимое файла на моем жестком диске, чтобы я мог варьировать макет с помощью разных поддельных входных данных. Это предназначено для тестирования пользовательской аутентификации для создания различных сложных прав пользователя.
В настоящее время я использую phpunit 9 и скоро обновлюсь до phphunit 10, поэтому я хочу избегать устаревших методов, таких как или withConsecutive.
Я думаю, что функция обратного вызова должна добиться этого, но, похоже, я не понимаю это правильно.

Код: Выделить всё

    private function mockAuthRedisService(
string $authFile = 'auth_admin',
string $userGlobalsFile = 'user_globals_admin'
): MockObject|AuthRedisServiceInterface {
$authJson = $this->readfile($authFile);
$userGlobalsJson = $this->readfile($userGlobalsFile);

$redisService = $this->getMockBuilder(AuthRedisServiceInterface::class)
->disableOriginalConstructor()
->getMock();

$redisService->expects($this->any())
->method('getAuthData')
->will(
$this->returnCallback(
function(string $keyName) {
if (strstr($keyName, 'authInfo')) return $authJson;
if (strstr($keyName, 'userGlobals')) return $userGlobalsJson;
}
)
);

return $redisService;
}

private function readfile(string $name): string
{
$path = __DIR__ . '/Unit/Security/test_data_files/' . $name . '.json';

return file_get_contents($path);
}

Итак, для аутентификации мне нужно прочитать два разных файла с моего «сервера Redis», и оба имеют сложную структуру json, поэтому я читаю их с диска.
В зависимости от разных тестов я хочу использовать разные входные файлы.
Поэтому в реальном использовании я вызываю метод «getAuthData» с разными строками и в зависимости от строк, которые я получаю обратно разные данные.
Как я могу добиться гибкости макетирования с разными входными файлами?
Текущая настройка дает мне TypeError: Mock_AuthRedisServiceInterface_4131c2db::getAuthData (): Возвращаемое значение должно иметь тип строки, возвращаемый null
Что неудивительно, поскольку две переменные, содержащие содержимое файла, не входят в функцию обратного вызова, и мне нужно представление о том, как данные из этих две переменные доступны в функции обратного вызова или альтернативном решении.
Я уже рассматривал эти вопросы:
[1] Издевающийся объект и ответ PHPunit по-разному при последовательных вызовах в зависимости от значения свойства объекта.
[2]PHPUnit Разные возвращаемые значения при каждом вызове имитируемого метода.
[3]Как я могу получить PHPUnit MockObjects для возврата разных значений на основе параметра?
и некоторых других и пытался адаптировать решения, но для моей цели это не подошло.

Подробнее здесь: https://stackoverflow.com/questions/775 ... -parameter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»