Symfony3使用phpunit测试redirectToRoute()方法

Symfony3使用phpunit测试redirectToRoute()方法,php,symfony,phpunit,symfony-3.2,Php,Symfony,Phpunit,Symfony 3.2,我正试图通过PHPUnit对Symfony3控制器进行一次最简单(我认为)的功能测试 我的控制器代码只是一个重定向: class DefaultController extends Controller { public function indexAction() { return $this->redirectToRoute('admin_dashboard', array(), 301); } } 我的测试功能如下: class Defaul

我正试图通过PHPUnit对Symfony3控制器进行一次最简单(我认为)的功能测试

我的控制器代码只是一个重定向:

class DefaultController extends Controller
{
    public function indexAction()
    {
        return $this->redirectToRoute('admin_dashboard', array(), 301);
    }
}
我的测试功能如下:

class DefaultControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient(array(), array(
            'HTTP_HOST' => 'www.admin.dev',
        ));

        $client->request('GET', '/');
        $client->followRedirect();
        $this->assertTrue($client->getResponse()->isRedirect('/dashboard/'));
    }
}
LogicException: The request was not redirected
$client->getRequest()->getUri() -> "http://www.admin.dev/"
$client->getResponse()->getStatusCode() -> 404
$client->getResponse() instanceof RedirectResponse -> false
$client->getResponse()->headers->get('location') -> null
我在这里得到的错误如下:

class DefaultControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient(array(), array(
            'HTTP_HOST' => 'www.admin.dev',
        ));

        $client->request('GET', '/');
        $client->followRedirect();
        $this->assertTrue($client->getResponse()->isRedirect('/dashboard/'));
    }
}
LogicException: The request was not redirected
$client->getRequest()->getUri() -> "http://www.admin.dev/"
$client->getResponse()->getStatusCode() -> 404
$client->getResponse() instanceof RedirectResponse -> false
$client->getResponse()->headers->get('location') -> null
对于某些值,我得到的一些结果如下:

class DefaultControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient(array(), array(
            'HTTP_HOST' => 'www.admin.dev',
        ));

        $client->request('GET', '/');
        $client->followRedirect();
        $this->assertTrue($client->getResponse()->isRedirect('/dashboard/'));
    }
}
LogicException: The request was not redirected
$client->getRequest()->getUri() -> "http://www.admin.dev/"
$client->getResponse()->getStatusCode() -> 404
$client->getResponse() instanceof RedirectResponse -> false
$client->getResponse()->headers->get('location') -> null
关于这个问题的更多背景:

  • 我有多个域指向同一个项目
  • 仅当请求相对域时,才会加载捆绑包
例如:

www.admin.dev -> admin bundle
www.admin2.dev -> admin2 bundle
www.admin3.dev -> admin3 bundle
你知道我在这个简单的问题上做错了什么吗

我的路由配置是:

homepage:
    host: "www.%domain%"
    path:     /
    defaults: { _controller: MyBundle:Default:index}

admin_dashboard:
    host: "www.%domain%"
    prefix:   /dashboard
    path:     /
    defaults: { _controller: MyBundle:Dashboard:index}


你可以试试这个。这是工作

$host="www.admin.dev" // $host= "http://127.1.1.2(local ip)"

public function testIndex()
{
    $client = static::createClient(array(), array(
        'HTTP_HOST' => $host,
    ));
    $client->request('GET', '/forgetpass');
    $this->assertEquals(true,$client->getResponse()->isRedirect('/dashboard'));
}

最后我解决了它。谢谢你给我指明了正确的方向。我的所有域都有自己的环境,因此,所有路由都不可用。比如:

www.admin.dev -> loads routes for only admin bundle
www.admin2.dev -> loads routes for only admin2 bundle
www.admin3.dev -> loads routes for only admin3 bundle
因此,为了解决这个问题,我首先通过调用调试“测试”环境的路由(因为该环境负责测试):

php bin/console debug:router --env=test
并发现它只包括通用路由,而不包括特定于域的路由。因此,为了在测试环境中包含路由,我将域的路由信息包含到测试路由文件中

对于那些仍然对我奇怪的配置感到好奇的人: 我有3个域指向我的项目:

www.admin.dev
www.admin2.dev
www.admin3.dev
根据此域,捆绑包的加载方式如下:

www.admin.dev  -> loads MyAdminBundle
www.admin2.dev -> loads MyAdmin2Bundle
www.admin3.dev -> loads MyAdmin3Bundle
我的每个域都有两个环境,分别为:

www.admin.dev  -> dev_admin  and prod_admin
www.admin2.dev -> dev_admin2 and prod_admin2
www.admin3.dev -> dev_admin3 and prod_admin3
基于这些域及其环境,我定义了配置和路由,以便在调用
www.domain.dev
时,它根据其环境使用配置、路由和相应的包,而不使用MyAdmin2Bundle或MyAdmin3Bundle或其任何路由或配置

为了更清楚一点,我有如下配置文件:

config.yml
config_dev.yml
config_dev_domain.yml
config_dev_domain2.yml
config_dev_domain3.yml
config_prod.yml
config_prod_domain.yml
config_prod_domain2.yml
config_prod_domain3.yml
config_test.yml
routing.yml
routing_dev.yml
routing_dev_domain.yml
routing_dev_domain2.yml
routing_dev_domain3.yml
routing_prod.yml
routing_prod_domain.yml
routing_prod_domain2.yml
routing_prod_domain3.yml
routing_test.yml
和路由文件,如:

config.yml
config_dev.yml
config_dev_domain.yml
config_dev_domain2.yml
config_dev_domain3.yml
config_prod.yml
config_prod_domain.yml
config_prod_domain2.yml
config_prod_domain3.yml
config_test.yml
routing.yml
routing_dev.yml
routing_dev_domain.yml
routing_dev_domain2.yml
routing_dev_domain3.yml
routing_prod.yml
routing_prod_domain.yml
routing_prod_domain2.yml
routing_prod_domain3.yml
routing_test.yml
现在我所做的,只是将domain、domain2和domain3的路由文件包含在
routing\u test.yml
中。
我希望这足以理解。

我已经试过了。$client->getResponse()->isRedirect(“/dashboard”)的值始终为false。是否可以写入路由配置?删除此代码$client->followRedirect()?很抱歉,我无法在回复中正确格式化代码,因此我编辑了我的原始帖子并添加了路由配置。$client->getResponse()->isRedirect('/dashboard/')的值总是错误的。我认为此“主机:”www.domain%''导致错误:/首先我的代码是错误的,但ıremove$client->followRedirect();然后返回true:('sory my engilish is not good')
$client->getResponse()->getStatusCode()->404
看起来您的
indexAction
路由甚至没有触发-查看日志和
router:debug
命令(可能还有post结果)。我的debug:router无法正常工作。因此,为了获得正确的路由,我需要将我的环境定义为:
php-bin/console-debug:router--env=dev_-frontend
你确定你的单元测试在同一个环境中运行吗?实际上我不确定,我很想知道这一点。有什么方法可以定义环境吗?我认为测试总是在“测试”环境中运行。只有启用了
framework.test
选项,测试客户端才可用。我猜您正在不同的环境中导入不同的路由。如果是这种情况,您应该为启用了
framework.test
选项的每个正常环境指定一个测试环境,或者重新考虑您的路由策略。目前,看起来您的路由甚至没有加载(因为您处于测试环境中),因此您得到了404。哎哟:没看到你在下面回答自己-应该接受,所以它在上面!;-)