Я делаю некоторые тесты с PHPUnit, но у меня есть некоторые проблемы, особенно при тестировании контроллера.
Я хочу проверить маршрут контроллера, просто вызвав маршрут и проверив, является ли ответ HTTP-статусом 200. Но в консоли всегда есть ошибки smae.
Он говорит что-то об отсутствующем токене. Я понятия не имею, что это за жетон.
Также это ошибка 401, которую он получает.
Мой PHPUnit-Test выглядит так:
пространство имен App\Tests\Controller;
используйте Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
класс PersonControllerTest расширяет WebTestCase { частный $ клиент;
protected function setUp()
{
$this->client = static::createClient([], [
'PHP_AUTH_USER' => 'user',
'PHP_AUTH_PW' => 'pass',
]);
}
public function testCreate()
{
$this->client->request('GET','/create');
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}
public function testIndex()
{
$this->client->request('GET','/');
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}
}
Я пробовал это с аутентификацией в методе setUp -> не сработало.
У вас есть какие-нибудь подсказки?
Спасибо за все ответы и/или комментарии
Обычно вы вообще не тестируете контроллеры, по крайней мере, в рамках модульного тестирования. Предполагается, что контроллеры не содержат никакой бизнес-логики и просто служат точками входа в приложение, поэтому вся бизнес-логика должна быть в отдельных классах, которые контроллер просто запускает при вызове. Если у вас есть бизнес-логика в ваших контроллерах, то ваш код демонстрирует антипаттерн под названием Fat Controller.
@GordonM Он / она не проводит модульное тестирование своего контроллера. Что он/она делает, так это то, что функциональное тестирование является контроллером, который абсолютно действителен - по крайней мере, в том, что касается Symfony.






Базовая авторизация:
/**
* @dataProvider urlProvider
*/
public function testPageIsSuccessful($url)
{
$client = self::createClient([], [
'PHP_AUTH_USER' => getenv('PHP_AUTH_USER'),
'PHP_AUTH_PW' => getenv('PHP_AUTH_PW')
]);
$client->request('GET', $url);
$this->assertTrue($client->getResponse()->isSuccessful());
}
ключ API
/**
* @dataProvider urlApiProvider
*/
public function testAPIWorks($url)
{
$accessToken = $this->getAccessToken();
$tokenQuery = http_build_query(['access_token' => $accessToken]);
$url .= '?' . $tokenQuery;
$client = self::createClient([]);
$client->request('GET', $url, [], [], ['HTTP_ACCEPT' => 'application/json']);
$this->assertTrue($client->getResponse()->isSuccessful());
}
protected function setUp()
{
$this->client = static::createClient();
$this->logIn();
}
private function logIn()
{
$session = $this->client->getContainer()->get('session');
$firewallName = 'test';
// if you don't define multiple connected firewalls, the context defaults to the firewall name
// See https://symfony.com/doc/current/reference/configuration/security.html#firewall-context
$firewallContext = 'test';
// you may need to use a different token class depending on your application.
// for example, when using Guard authentication you must instantiate PostAuthenticationGuardToken
$testUser = new WebserviceUser('[email protected]', ['ROLE_ADMIN'],
array("employeeid" => array(420),
"mail" => array("[email protected]")), false);
$token = new UsernamePasswordToken($testUser, null, $firewallName, ['ROLE_ADMIN']);
//var_dump($token);
$session->set('_security_' . $firewallContext, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
public function testCreate()
{
$crawler = $this->client->request('GET', '/create');
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$form = $crawler->filter('form')->form([
'person[name]' => 'Chruit',
'person[birthdate][month]' => 2,
'person[birthdate][day]' => 15,
'person[birthdate][year]' => 2014,
]);
$this->client->submit($form);
}
public function testIndex()
{
$this->client->request('GET', '/');
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}
}
Решение - это просто функция входа в систему. $testUser должен находиться в вашей Active Directory или в вашей сети. Остальные параметры значения не имеют.
Мой брандмауэр заблокировал его, поэтому я не мог сделать это обычным способом.
Если вы делаете это так, вам нужно добавить что-то в файл secourity.yaml, который был создан при установке PHPUnit.
Трудно придумать решение, не видя большую часть вашего кода, но попробуйте добавить токен в качестве 4-го аргумента в свой
requestметод, что-то вроде этого$this->client->request ........, ['HTTP_AUTHORIZATION' => 'Bearer Token']). Также, если клиенту требуется HTTPS, вы должны добавить'HTTPS' => true. Вы используете базовую авторизацию? Если это так, просто удалитеPHP_AUTH_USERи другой, а затем используйтеBasic your_base_64_token_goes_hereвместо Bearer выше.