0

I've got this very simple acceptance test using Codeception and its Symfony2 module:

public function myTest(AcceptanceTester $I)
{
    $I->wantTo('test something');
    $I->amOnRoute("acme_site_home.es");
    $I->dontSee('hello');
}

When I run it I get an Undefined index: localhost PHPUnit_Framework_Exception triggered by a call to $request->server->get("HTTP_HOST") in my route action.

I already tried the following:

  • Adding this to phpunit.xml:
    <phpunit>
        <php>
            <server name='HTTP_HOST' value='http://some.host.com' />
        </php>
    </phpunit>
  • Adding this to my test:
    $_SERVER['HOST_NAME'] = "some.host.com";
  • Adding this to my test:
    $_SERVER['HTTP_HOST'] = "some.host.com";

None of this works, I always get the same error message.

How could I fix this?


Notes

[everything given here is sanitized (passwords, hostnames, etc.) and some line breaks and indentation were added for readability]

Just in case, my acceptance suite settings are as follows:

class_name: AcceptanceTester
modules:
    enabled:
        - Asserts
        - Db
        - Symfony2
        - Doctrine2
        - \Tests\Helper\Acceptance

And my Codeception settings:

namespace: Tests
actor: Tester
paths:
    tests: tests
    log: tests/_output
    data: tests/_data
    support: tests/_support
    envs: tests/_envs
settings:
    bootstrap: _bootstrap.php
    colors: true
    memory_limit: 1024M
extensions:
    enabled: [ Codeception\Extension\RunFailed ]
modules:
    config:
        Db:
            dsn: 'mysql:host=localhost;dbname=acme_test'
            user: 'root'
            password: 'blahblah'
            dump: 'tests/_data/dump.sql'
            populate: false
            cleanup: false
        Doctrine2:
            depends: Symfony2
            cleanup: false
        PhpBrowser:
            url: http://acme.com
        WebDriver:
             browser: firefox
             url: http://acme.com
        REST:
            depends: Symfony2
            url: http://acme.com

Here is the result of running the test with the -vvv flag:

$ bin/codecept run tests/acceptance/ExtranetBundle/Controller/DefaultControllerCest.php -vvv

Codeception PHP Testing Framework v2.1.3
Powered by PHPUnit 4.8.13 by Sebastian Bergmann and contributors.

Tests.acceptance Tests (1) ---------------------------------------------------------------------------------------------------------------------------
Modules: Asserts, Db, Symfony2, Doctrine2, \Tests\Helper\Acceptance
------------------------------------------------------------------------------------------------------------------------------------------------------
Test something (Acceptance\ExtranetBundle\Controller\DefaultControllerCest::myTest)
Scenario:
* I am on route "acme_site_home.es"

[Page] http://localhost/es
[User] anon. []
* I don't see "hello"
FAIL

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
------------------------------------------------------------------------------------------------------------------------------------------------------


Time: 4.13 seconds, Memory: 65.75Mb

There was 1 failure:

---------
1) Failed to test something in Tests\Acceptance\ExtranetBundle\Controller\DefaultControllerCest::myTest (tests/acceptance/ExtranetBundle/Controller/DefaultControllerCest.php)

Step  I don't see "hello"
Fail  Failed asserting that   /es
-->

Undefined index: localhost (500 Internal Server Error)

[Content too long to display. See complete response in '_output' directory]
--> does not contain "hello".

Scenario Steps:

2. $I->dontSee("hello") at tests/acceptance/ExtranetBundle/Controller/DefaultControllerCest.php:15
1. $I->amOnRoute("acme_site_home.es") at tests/acceptance/ExtranetBundle/Controller/DefaultControllerCest.php:14

/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/Constraint/Not.php:100
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/Assert.php:2255
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Util/Shared/Asserts.php:280
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php:1263
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php:284
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Step.php:193
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Shared/Actor.php:99
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Scenario.php:101
/Volumes/Utilisateurs/marc/Sites/acme.com/tests/_support/_generated/AcceptanceTesterActions.php:831
/Volumes/Utilisateurs/marc/Sites/acme.com/tests/acceptance/ExtranetBundle/Controller/DefaultControllerCest.php:15
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/Di.php:112
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Cest.php:127
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Cest.php:136
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Cest.php:66
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestCase.php:909
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestCase.php:768
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestResult.php:612
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestCase.php:724
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestSuite.php:747
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/PHPUnit/Runner.php:89
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/SuiteManager.php:153
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Codecept.php:203
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Codecept.php:172
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Command/Run.php:184
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:259
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:878
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:195
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:126
/Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/codecept:28


FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

And here is the error stack trace given by Symfony in the _output directory:

PHPUnit_Framework_Exception: Undefined index: localhost
at n/a
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Subscriber/ErrorHandler.php line 48

at Codeception\Subscriber\ErrorHandler->errorHandler('8', 'Undefined index: localhost', '/Volumes/Utilisateurs/marc/Sites/acme.com/src/Acme/SiteBundle/Controller/DefaultController.php', '160', array(
    'request' => object(Request),
    'locale' => 'es',
    'registrationForm' => object(Form),
    'typeAppFb' => array(
        'acme.com' => array(
            'appId' => '123456789123456',
            'secret' => '123456789abcdef123456789abcdef12'
        ),
        'dev.acme.com' => array(
            'appId' => '123456789123456',
            'secret' => '123456789abcdef123456789abcdef12'
        ),
        'www.prod-acme.com' => array(
            'appId' => '123456789123456',
            'secret' => '123456789abcdef123456789abcdef12'
        )
    )
))
in /Volumes/Utilisateurs/marc/Sites/acme.com/src/Acme/SiteBundle/Controller/DefaultController.php line 160

at Acme\SiteBundle\Controller\DefaultController->homeAction(object(Request))
in  line

at call_user_func_array(array(object(DefaultController), 'homeAction'), array(object(Request)))
in /Volumes/Utilisateurs/marc/Sites/acme.com/app/bootstrap.php.cache line 3109

at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1')
in /Volumes/Utilisateurs/marc/Sites/acme.com/app/bootstrap.php.cache line 3071

at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true)
in /Volumes/Utilisateurs/marc/Sites/acme.com/app/bootstrap.php.cache line 3222

at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true)
in /Volumes/Utilisateurs/marc/Sites/acme.com/app/bootstrap.php.cache line 2444

at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Client.php line 81

at Symfony\Component\HttpKernel\Client->doRequest(object(Request))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/Connector/Symfony2.php line 38

at Codeception\Lib\Connector\Symfony2->doRequest(object(Request))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/BrowserKit/Client.php line 327

at Symfony\Component\BrowserKit\Client->request('GET', '/es', array(), array(), array(), null, true)
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php line 130

at Codeception\Lib\InnerBrowser->clientRequest('GET', '/es', array(), array(), array(), null)
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php line 159

at Codeception\Lib\InnerBrowser->_loadPage('GET', '/es')
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php line 203

at Codeception\Lib\InnerBrowser->amOnPage('/es')
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Module/Symfony2.php line 197

at Codeception\Module\Symfony2->amOnRoute('acme_site_home.es')
in  line

at call_user_func_array(array(object(Symfony2), 'amOnRoute'), array('acme_site_home.es'))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Step.php line 193

at Codeception\Step->run(object(ModuleContainer))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Shared/Actor.php line 99

at Codeception\TestCase\Cest->runStep(object(Condition))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Scenario.php line 101

at Codeception\Scenario->runStep(object(Condition))
in /Volumes/Utilisateurs/marc/Sites/acme.com/tests/_support/_generated/AcceptanceTesterActions.php line 579

at Tests\AcceptanceTester->amOnRoute('acme_site_home.es')
in /Volumes/Utilisateurs/marc/Sites/acme.com/tests/acceptance/ExtranetBundle/Controller/DefaultControllerCest.php line 14

at Tests\Acceptance\ExtranetBundle\Controller\DefaultControllerCest->myTest(object(AcceptanceTester))
in  line

at ReflectionMethod->invokeArgs(object(DefaultControllerCest), array(object(AcceptanceTester)))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Lib/Di.php line 112

at Codeception\Lib\Di->injectDependencies(object(DefaultControllerCest), 'myTest', array(object(AcceptanceTester), object(Scenario)))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Cest.php line 127

at Codeception\TestCase\Cest->invoke('myTest', array(object(AcceptanceTester), object(Scenario)))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Cest.php line 136

at Codeception\TestCase\Cest->executeTestMethod(object(AcceptanceTester))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/TestCase/Cest.php line 66

at Codeception\TestCase\Cest->testCodecept()
in  line

at ReflectionMethod->invokeArgs(object(Cest), array())
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestCase.php line 909

at PHPUnit_Framework_TestCase->runTest()
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestCase.php line 768

at PHPUnit_Framework_TestCase->runBare()
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestResult.php line 612

at PHPUnit_Framework_TestResult->run(object(Cest))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestCase.php line 724

at PHPUnit_Framework_TestCase->run(object(PHPUnit_Framework_TestResult))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/phpunit/phpunit/src/Framework/TestSuite.php line 747

at PHPUnit_Framework_TestSuite->run(object(PHPUnit_Framework_TestResult))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/PHPUnit/Runner.php line 89

at Codeception\PHPUnit\Runner->doEnhancedRun(object(Suite), object(PHPUnit_Framework_TestResult), array(
    'silent' => false,
    'debug' => false,
    'steps' => false,
    'html' => false,
    'xml' => false,
    'json' => false,
    'tap' => false,
    'report' => false,
    'colors' => true,
    'coverage' => false,
    'coverage-xml' => false,
    'coverage-html' => false,
    'coverage-text' => false,
    'groups' => null,
    'excludeGroups' => null,
    'filter' => null,
    'env' => null,
    'fail-fast' => false,
    'verbosity' => '4',
    'interactive' => true,
    'no-rebuild' => false,
    'bootstrap' => '_bootstrap.php',
    'memory_limit' => '1024M',
    'log' => false,
    'strict_xml' => false,
    'verbose' => true
))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/SuiteManager.php line 153

at Codeception\SuiteManager->run(object(Runner), object(PHPUnit_Framework_TestResult), array(
    'silent' => false,
    'debug' => false,
    'steps' => false,
    'html' => false,
    'xml' => false,
    'json' => false,
    'tap' => false,
    'report' => false,
    'colors' => true,
    'coverage' => false,
    'coverage-xml' => false,
    'coverage-html' => false,
    'coverage-text' => false,
    'groups' => null,
    'excludeGroups' => null,
    'filter' => null,
    'env' => null,
    'fail-fast' => false,
    'verbosity' => '4',
    'interactive' => true,
    'no-rebuild' => false,
    'bootstrap' => '_bootstrap.php',
    'memory_limit' => '1024M',
    'log' => false,
    'strict_xml' => false,
    'verbose' => true
))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Codecept.php line 203

at Codeception\Codecept->runSuite(array(
    'class_name' => 'AcceptanceTester',
        'modules' => array(
            'enabled' => array(
                'Asserts',
                'Db',
                'Symfony2',
                'Doctrine2',
                '\Tests\Helper\Acceptance'
            ),
            'config' => array(
                'Db' => array(
                    'dsn' => 'mysql:host=localhost;dbname=acme_test',
                    'user' => 'root',
                    'password' => 'blahblah',
                    'dump' => 'tests/_data/dump.sql',
                    'populate' => false,
                    'cleanup' => false
                ),
                'PhpBrowser' => array(
                    'url' => 'http://acme.com'
                ),
                'WebDriver' => array(
                    'url' => 'http://acme.com',
                    'browser' => 'firefox'
                ),
                'REST' => array(
                    'url' => 'http://acme.com',
                    'depends' => 'Symfony2'
                ),
                'Doctrine2' => array(
                    'depends' => 'Symfony2',
                    'cleanup' => false
                )
            ),
            'depends' => array()
        ),
        'colors' => true,
        'bootstrap' => '_bootstrap.php',
        'memory_limit' => '1024M',
        'log' => false,
        'strict_xml' => false,
        'coverage' => array(),
        'namespace' => 'Tests',
        'groups' => array('failed' => 'tests/_output/failed'),
        'path' => '/Volumes/Utilisateurs/marc/Sites/acme.com/tests/acceptance/',
        'shuffle' => false,
        'error_level' => 'E_ALL & ~E_STRICT & ~E_DEPRECATED'
    ),
    'acceptance',
    'ExtranetBundle/Controller/DefaultControllerCest.php'
)
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Codecept.php line 172

at Codeception\Codecept->run('acceptance', 'ExtranetBundle/Controller/DefaultControllerCest.php')
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/src/Codeception/Command/Run.php line 184

at Codeception\Command\Run->execute(object(ArgvInput), object(ConsoleOutput))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php line 259

at Symfony\Component\Console\Command\Command->run(object(ArgvInput), object(ConsoleOutput))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php line 878

at Symfony\Component\Console\Application->doRunCommand(object(Run), object(ArgvInput), object(ConsoleOutput))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php line 195

at Symfony\Component\Console\Application->doRun(object(ArgvInput), object(ConsoleOutput))
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php line 126

at Symfony\Component\Console\Application->run()
in /Volumes/Utilisateurs/marc/Sites/acme.com/vendor/codeception/codeception/codecept line 28
7
  • Run codeception with -vvv flag to get the stack trace, then add stack trace to you question. Commented Nov 27, 2015 at 21:23
  • @Naktibalda Thanks. I added it as well as the Symfony error stack trace. Commented Nov 28, 2015 at 11:06
  • So it happens in /Volumes/Utilisateurs/marc/Sites/acme.com/src/Acme/SiteBundle/Controller/DefaultController.php line 160 , right? Commented Nov 28, 2015 at 18:24
  • Yes, this is the line with the $request->server->get("HTTP_HOST") I mentioned in my question. Commented Nov 28, 2015 at 22:04
  • But the bug is in your code. HTTP_HOST is always set in Server Parameters. Your problem is that there is no localhost in typeAppFb and you don't check with isset() before reading out of it. Commented Nov 29, 2015 at 10:59

1 Answer 1

3

It was a two-sided issue:

  1. The code doesn't handle unknown domains well and emits a warning, PhpUnit turns the warning into exception.

  2. To test the request to specific domain, you must make request to that domain, e.g. $I->amOnPage('http://acme.com/es');. Since you are using a Symfony2 module, it doesn't make the actual HTTP request to that sites, but handles it internally. If you are using amOnRoute() method, make sure that the url generated by the route includes the hostname component.

P.S. I don't know how does the site bundle work, but I recommend having at least one hostname based route for that domain or your test may stop working with future versions of Codeception.

Sign up to request clarification or add additional context in comments.

4 Comments

Could you clarify "having at least one hostname based route for that domain", please? I work in a team, and my local hostname is not the same as my teammates' or the production website. Ideally, I would expect the Symfony2 module to accept some kind of a baseUrl setting in codeception.yml (which is developer specific) but it's not the case...
Symfony2 module does not make HTTP requests, so you can use any domains or no domain at all in the tests. As you could see before, localhost is used by default and that is just fine for Codeception and Symfony2.
By hostname based route I meant this: symfony.com/doc/current/components/routing/…
I understand all of this, but how should I define a hostname based route if every developer in my team uses a different hostname, for instance? The Symfony2 module doesn't seem to accept such setting.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.