Symfony3使用phpunit

时间:2017-05-30 09:06:01

标签: php symfony phpunit symfony-3.2

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

2 个答案:

答案 0 :(得分:0)

你试试这个。这是工作。

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

答案 1 :(得分:0)

最后我解决了。感谢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

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

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中。 我希望这足以理解。