簡體   English   中英

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

因此,要解決該問題,我首先通過調用以下命令來調試“測試”環境的路由(因為該環境負責測試):

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和routing_test.yml的路由文件包含到routing_test.yml 我希望這足以理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM