- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在为我的应用程序创建单元测试,但这是我第一次这样做。
我想测试这个功能:
/**
* This method search if the user is already in a team for the same tournament than the one passed in argument
* @param User $user
* @param Team $team
* @return bool|Team|mixed
*/
public function isAlreadyApplicant($user, Team $team) {
if (!$user || !$this->authorizationChecker->isGranted("ROLE_USER")) {
return false;
}
foreach ($user->getApplications() as $userTeam) {
/** @var Team $userTeam */
if ($userTeam->getTournament()->getId() === $team->getTournament()->getId()) {
return $userTeam;
}
}
foreach ($user->getTeams() as $userTeam) {
/** @var Team $userTeam */
if ($userTeam->getTournament()->getId() === $team->getTournament()->getId()) {
return $userTeam;
}
}
foreach ($user->getManagedTeam() as $userTeam) {
/** @var Team $userTeam */
if ($userTeam->getTournament()->getId() === $team->getTournament()->getId()) {
return $userTeam;
}
}
return false;
}
如您所见,第一个测试是检查用户是否拥有 ROLE_USER。
当我尝试“记录我的用户”时,我收到此消息:
Fatal error: Call to a member function getToken() on null in \vendor\symfony\symfony\src\Symfony\Component\Security\Core\Authorization\AuthorizationChecker.php on line 56
我尝试了在 Symfony 文档中找到的内容,但我一定错过了一些东西。这是我的测试类:
class ApplicationCheckerTest extends WebTestCase
{
protected $client = null;
public function setUp() {
$this->client = static::createClient();
/** @var User $user */
$user = $this->client->getContainer()->get('doctrine')->getManager()->getRepository('MGDUserBundle:User')->findOneBy(array("email" => 'Player11.Player11@test.com'));
$this->loginUser("main", $user);
}
protected function loginUser($firewallName, UserInterface $user, array $options = array(), array $server = array())
{
$this->client = static::createClient();
$token = new UsernamePasswordToken($user, null, $firewallName, $user->getRoles());
static::$kernel->getContainer()->get('security.token_storage')->setToken($token);
$session = $this->client->getContainer()->get('session');
$session->set('_security_'.$firewallName, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
public function testIsAlreadyApplicantIsNotConnected()
{
$user = new User();
$team = new Team();
$router = $this->createMock(Router::class);
$authorizationChecker = $this->createMock(AuthorizationChecker::class);
$applicationChecker = new ApplicationChecker($router, $authorizationChecker);
$applicationChecker->isAlreadyApplicant($user, $team);
}
}
我的 security.yml 看起来像:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
anonymous: true
provider: main
form_login:
login_path: fos_user_security_login
check_path: fos_user_security_check
logout:
path: fos_user_security_logout
target: /
remember_me:
secret: '%secret%'
我尝试将我创建的用户与灯具连接起来。
我不确定我尝试这样做的方式,也许我走错了路,如果我错了请不要犹豫纠正我!
有关信息,我在 Symfony 3.2.13
祝你有个美好的一天
最佳答案
WebTestCase
和您正在使用的 Symfony 文档中的示例应该用于 Controller 的功能测试。
您为客户端设置身份验证的方式正确。但是您没有使用该客户端向测试用例中的自举 Symfony 内核发出请求。您只是在手动创建的服务实例上进行简单的单元测试,这很好。
为此,您可以简单地使用 PHPUnit\Framework\TestCase
。
可以使用 WebTestCase
来测试您的服务并覆盖内核容器中 AuthorizationChecker
中使用的 TokenStorage
客户端容器,然后还从内核容器中获取您的服务,而不是自己实例化它。但我看不出有什么好处。无需测试 Symfony 组件(如果 isGranted 正在运行)。那是在 Symfony 项目的范围内,很可能已经涵盖在那里。
您出错的原因是无法模拟 final 方法。作为解决方法,您可以在 ApplicationChecker
构造函数中将依赖项设置为 AuthorizationCheckerInterface
,然后从测试中的接口(interface)创建一个模拟。
$authorizationChecker = $this->createMock(AuthorizationCheckerInterface::class);
$authorizationChecker->method('isGranted')->willReturn(true);
关于symfony - authorizationChecker->isGranted 在 phpUnit 测试中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45593669/
假设有某些路由字符串,例如受防火墙保护的“/path/index.html”,如何检查当前用户是否能够访问它? 提前致谢! 对不起,我应该更明确一点:我有一个路由名称数组,我构建了一个菜单。许多具有不
我发现在 Symfony 中我可以使用注释以一种干净的方式向我的 Controller 方法添加额外的功能,这真的很方便。例如: /** * @Route("/{id}") * @IsGrante
任何人都可以解释以下 c# 行为吗?我已经编写了一个小型控制台应用程序来了解 CAS,但我似乎无法理解为什么以下代码行会像它们那样工作: string[] myRoles = new string[]
有时,我有一个页面,我想对不同规则的复杂组合使用react,这些规则总共只是一件事:“当前用户可以执行此操作吗?”。 目前,大多数检查都直接在我的 Controller 内进行,因此我可以: if($
在我的应用程序中测试角色时,我发现了 SecurityContext 的函数 isGranted。它工作得很好,但现在我需要检查不是当前用户的用户的角色,所以 isGranted 对我不起作用。 我一
我目前正在为我的应用程序创建单元测试,但这是我第一次这样做。 我想测试这个功能: /** * This method search if the user is already in a team
我正在开发一个 Symfony2 应用程序,我们想在其中引入 Security Voters . DX 计划(jay!)给我们带来了the simpler version这种机制,所以我想使用它。关于
我正在将 Symfony 从 2.8 升级到 3.4,并且我有一个身份验证监听器。 监听器的构造器 public function __construct(EntityManager $entit
我在 Symfony 2 项目中使用 SonataAdminBundle 和 SonataUserBundle。安装的包是: $ composer show | grep symfony friend
我是一名优秀的程序员,十分优秀!