symfony - Symfony 4, PHPUnit - 授权用户进行单元测试
问题描述
我正在编写测试来对控制器进行单元测试。我想检查我是否获得了正确的 url 内容,这需要用户登录。
我写了以下测试
class AdminControllerTest extends WebTestCase
{
private $client = null;
public function setUp()
{
$this->client = static::createClient();
}
public function testAdminHome(): void
{
$this->logIn();
$crawler = $this->client->request('GET', '/admin/');
$this->assertSame(Response::HTTP_OK, $this->client->getResponse()->getStatusCode());
$this->assertGreaterThan(0, $crawler->filter('html:contains("Welcome to Admin Panel")')->count());
}
private function logIn()
{
$user = new User();
$user->setId(1);
$user->setEmail('test@admin.com');
$user->setFullName('Admin User');
$user->setEnabled(true);
$session = $this->client->getContainer()->get('session');
$firewallName = 'main';
$firewallContext = 'main';
$token = new UsernamePasswordToken($user, null, $firewallName, ['ROLE_ADMIN']);
$session->set('_security_'.$firewallContext, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
}
我的 security.yml 中的配置
security:
encoders:
App\Entity\User: auto
providers:
database_users:
entity:
class: App\Entity\User
property: username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: true
pattern: ^/
context: main
form_login:
check_path: security_login
login_path: security_login
csrf_token_generator: security.csrf.token_manager
default_target_path: admin_home
logout:
path: security_logout
target: security_login
access_control:
- { path: ^/admin, roles: [ROLE_ADMIN, ROLE_EDITOR] }
role_hierarchy:
ROLE_ADMIN: ROLE_EDITOR
ROLE_EDITOR: ROLE_USER
然而,响应代码的断言返回我 200,但我登陆登录页面而不是管理员主页。也没有必需的内容,因为我在登录页面而不是管理员主页。
您能否检查代码并帮助我找出问题所在?
解决方案
用户@isom 是对的,我应该让用户对象持久化,所以我使用固定装置让用户持久化,然后一切都很好。我没有创建新的用户对象,而是使用以下代码从数据库中提取它:
$user = self::$kernel->getContainer()->get('doctrine')->getRepository(User::class)->find(1);
推荐阅读
- java - 在java中获取两个数组的排列的算法
- vue.js - 更改值时Vue v-if不刷新
- android - 关闭 Admob 2021 插页式广告后如何重新上传?
- excel - 使用 Range B4 的颜色格式化两个日期之间的单元格
- javascript - 从对象数组创建对象数组数组
- rxjs - 将 WithLatestFrom 中的值传递给另一个运算符 - Rxjs,Ngrx 效果
- c# - Nuget 私有源 - 可以在 PackageReference 中设置条件吗?
- email - Google 表格 - 创建 PDF 并发送电子邮件(不同的 PDF 到不同的电子邮件)
- javascript - 通过单击带有jquery的按钮在循环中显示图像?
- sql-server - 空间数据的 MS SQL Server 2019 到 PostgreSQL/PostGIS 12 的速度差异