【问题标题】:PHP Unit doesn't detect my test - Symfony - Unit test URL Profile user PagePHP 单元未检测到我的测试 - Symfony - 单元测试 URL 配置文件用户页面
【发布时间】:2021-07-20 01:45:59
【问题描述】:

我已经有几个包含表单或 URL 测试的文件。但是,对于需要用户登录的测试(我使用了 Symfony 的预定义 loginUser 函数),它们不会被检测到。当我在终端上使用命令“php bin / phpunit”时,测试的数量并没有增加,这些测试没有考虑在内。请问我该怎么办? 例如,下面是测试个人资料页面 URL 的代码:

<?php

namespace App\tests\Controller;

use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ProfilControllerTest extends WebTestCase
{

    public function testMyProfil()
    {
        $client = static::createClient();
        $userRepository = static::$container->get(UserRepository::class);

        //retrieve the test user (in the fixtures)
        $testUser = $userRepository->findOneByEmail('Alex@gmail.com');

        //simulate $testUser being logged in
        $client->loginUser($testUser);

        // test the profile page
        $client->request('GET', '/monProfil');
        $this -> assertEquals ( 200 , $client -> getResponse () -> getStatusCode ());
    }

}

这是一个检测到的 PHPUnit 测试示例,它也是一个 URL 测试,但不需要登录:

<?php

namespace App\tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class AboutControllerTest extends WebTestCase
{
    public function testAbout()
    {
        $client = static::createClient();

        //teste the page "about us"
        $client->request('GET', '/aboutUs');
        $this -> assertEquals ( 200 , $client -> getResponse () -> getStatusCode ());
    }
}

【问题讨论】:

  • 我们能看到一个实际检测比较的测试示例吗?您也可以尝试使用此命令vendor\bin\phpunit 这是我使用的命令
  • 这个命令在我的终端上不起作用,错误是“bash: vendorbinphpunit: command not found”。我在我的问题中添加了一个示例。
  • 测试没有运行,所以你的意思是它没有被 phpunit 检测到,对吗?你能检查你的phpunit.xsd 文件吗?查看过滤器>白名单>排除标签
  • 是的,它没有被 phpunit 检测到。在我的 phpunit.xml.dist 中:&lt;whitelist processUncoveredFilesFromWhitelist="true"&gt; &lt;directory suffix=".php"&gt;src&lt;/directory&gt; &lt;/whitelist&gt;
  • 您确定在项目的根目录中,运行vendor\bin\phpunit 出错了吗?我问是因为你写了bash : vendorbinphpunit:...

标签: php unit-testing symfony testing phpunit


【解决方案1】:

当您使用 loginUser($user) 函数时,它所做的是创建一个“浏览器令牌”并将其设置为会话。当您进行单元测试时,此操作不起作用。

你能做的是;

$token = new UsernamePasswordToken($user, null, 'main', []);
$client->getContainer()->get('security.token_storage')->setToken($token);

这将为用户设置必要的令牌并模拟登录过程。

UsernamePasswordToken 类是;

Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken

为了进一步测试,将令牌设置为客户端后,您可以获取授权检查器并检查用户是否被授予特定模型。

$auth = $client->getContainer()->get('security.authorization_checker');
$post = new Post();
$this->assertTrue($auth->isGranted(AbstractObjectsVoter::READ, $post));

【讨论】:

  • 作者的问题与测试中如何登录用户无关。他就是无法运行这个测试。
  • 使用用户创建令牌并将该令牌设置给客户端即可完成这项工作。在执行完运行测试的客户端后,该客户端将登录。正如我在答案中所说,第二部分是为了进一步测试。
  • 你能写出全部的代码吗?因为我根据您的指示尝试了很多东西,但总是遇到同样的问题
猜你喜欢
  • 1970-01-01
  • 2019-01-04
  • 2019-06-04
  • 2018-01-12
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多