带有MinkBundle的Symfony2上的Behat / Mink代码覆盖率

时间:2014-07-31 11:35:48

标签: symfony phpunit code-coverage behat mink

我已经使用composer安装了所有必需的包:

"behat/behat": "*",
"behat/symfony2-extension": "*",
"behat/mink": "*",
"behat/mink-bundle": "dev-master",
"behat/mink-extension": "*",
"behat/mink-goutte-driver": "*",
"behat/mink-selenium2-driver": "*",
"phpunit/phpunit": "4.1.*",
"phpunit/phpunit-selenium": ">=1.2",

然后我按照MinkBundle关于代码覆盖率的文档(https://github.com/Behat/MinkBundle/blob/master/Resources/doc/coverage.rst

但是我无法覆盖我的功能测试。

以下是ControllerTest的示例:

namespace Keep\AccountBundle\Tests;
use Behat\MinkBundle\Test\MinkTestCase;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Input\ArrayInput;
use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand;
use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand;
use Doctrine\Bundle\DoctrineBundle\Command\Proxy\CreateSchemaDoctrineCommand;

class UserControllerTest extends MinkTestCase
{
    protected $base;

    protected function setUp()
    {
        $this->base = $this->getKernel()
            ->getContainer()
            ->getParameter('mink.base_url');

        //fixtures loading code
    }

    private function doLogin($username, $password) {
        $session = $this->getMink()->getSession();
        $session->visit($this->base.'/login');
        $page = $session->getPage();
        $page->fillField('username', $username);
        $page->fillField('password', $password);
        $page->pressButton('Login');

        $this->assertEquals($this->base.'/', $session->getCurrentUrl());
    }

    public function testList() {
        $this->doLogin('superadmin', 'superadmin');

        $session = $this->getMink()->getSession();
        $session->visit($this->base.'/account/user');

        $this->assertEquals('200', $session->getStatusCode());
        $this->assertCount(9, $session->getPage()->findAll('css', '#list-table tbody tr'));
    }
}

当我运行命令时:

php phpunit.phar --coverage-html ./mink-report -c app/ src/Bundle/AccountBundle/Tests/Controller/UserControllerTest.php

所有测试都没问题,但Controller的覆盖率为0%。所涉及的只是灯具代码(DataFixtures文件夹和实体设置器。

1 个答案:

答案 0 :(得分:0)

我的理由是Mink使用他自己的php环境,因此phpunit无法跟踪代码。

所以,在你的yml配置中(在我的例子中是config_test.yml):

#config/config_test.yml

// ...    

mink:
    base_url:           http://myproject.test
    #default_session:    goutte
    browser_name:       firefox
    #goutte:             ~
    #selenium2:          ~

我刚评论了default_session选项,并禁用了goutteselenium2驱动程序,以确保两者均未使用。

现在我得到了我的代码覆盖率,但是!失败会导致错误。

我的测试网址的base_url是 myproject.test / app_test.php

在我的某个测试中,当我尝试通过填写我的身份验证表单登录时,它会将我重定向到 myproject.test / !而不是 myproject.test / app_test.php

解决此问题的唯一方法是创建一个直接指向app_test.php的主机,而不是 myproject.test /

现在我的 myproject.test / login (由于我的vhost指向它而使用app_test.php),重定向 myproject.test /