Поскольку это все равно было бы легко, я хочу, чтобы в качестве возвращаемого значения было содержимое файла на моем жестком диске, чтобы я мог варьировать макет с помощью разных поддельных входных данных. Это предназначено для тестирования пользовательской аутентификации для создания различных сложных прав пользователя.
В настоящее время я использую 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);
}
В зависимости от разных тестов я хочу использовать разные входные файлы.
Поэтому в реальном использовании я вызываю метод «getAuthData» с разными строками и в зависимости от строк, которые я получаю обратно разные данные.
Как я могу добиться гибкости макетирования с разными входными файлами?
Текущая настройка дает мне TypeError: Mock_AuthRedisServiceInterface_4131c2db::getAuthData (): Возвращаемое значение должно иметь тип строки, возвращаемый null
Что неудивительно, поскольку две переменные, содержащие содержимое файла, не входят в функцию обратного вызова, и мне нужно представление о том, как данные из этих две переменные доступны в функции обратного вызова или альтернативном решении.
Я уже рассматривал эти вопросы:
[1] Издевающийся объект и ответ PHPunit по-разному при последовательных вызовах в зависимости от значения свойства объекта.
[2]PHPUnit Разные возвращаемые значения при каждом вызове имитируемого метода.
[3]Как я могу получить PHPUnit MockObjects для возврата разных значений на основе параметра?
и некоторых других и пытался адаптировать решения, но для моей цели это не подошло.
Подробнее здесь: https://stackoverflow.com/questions/775 ... -parameter
Мобильная версия