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
中。
我希望这足以理解。
我正在尝试通过 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
中。
我希望这足以理解。