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