Symfony3 使用 phpunit 测试 redirectToRoute() 方法

Symfony3 testing the redirectToRoute() method with phpunit

我正在尝试通过 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

关于此问题的更多背景信息:

例如:

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}

%domain% is a parameter in the parameter file. The value is 'admin.dev'

你正在尝试这个。这是工作。

$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'));
}

终于解决了。感谢 ccKep 为我指明了正确的方向。我所有的域都有自己的环境,因此所有路由都不可用。喜欢:

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

所以,为了解决这个问题,我首先通过调用 'test' 环境(因为这个环境负责测试)来调试路由:

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

我的每个域都有 2 个环境:

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

现在我所做的只是将domain、domain2 和domain3 的路由文件包含到routing_test.yml 中。 我希望这足以理解。