2013-05-10 95 views
1

我正在为Symfony2.0项目开发一些测试并使用PHPUnit运行它们。PHPUnit 3.7.19和Symfony2破解测试

在我的电脑上工作正常,但在其他环境中尝试失败。我认为问题是PHP版本,但在不同的环境中运行后,我迷路了。

  • 我的环境是Ubuntu 12.04和PHP 5.3.10 =>工作正常。

  • 2 PC与Ubuntu 12.10和PHP 5.4.6:

    Fatal error: Call to a member function get() on a non-object 
    

此错误是在其上延伸的Symfony \捆绑\ FrameworkBundle \测试\ WebTestCase其中被覆盖的一类setUp()和tearDown()方法。

public function setUp() 
{ 
    $this->client = static::createClient(); 
    $this->client->followRedirects(true); 

    $crawler = $this->client->request('GET', '/admin/login'); 

    $loginForm = $crawler->selectButton('save')->form(array(
     '_username' => 'user', 
     '_password' => 'pass' 
     )); 
    $this->client->submit($loginForm); 

    $this->container = $this->client->getContainer(); 
    parent::setUp(); 
} 

public function tearDown() 
{ 
    //Here is get() on a non-object, $this->container doesn't exists 
    $this->container->get('doctrine.odm.mongodb.document_manager')->getConnection()->close(); 
    parent::tearDown(); 
} 
  • 2 PC,一个与Ubuntu 12.10和PHP 5.4.6和其他与Windows 7和PHP 5.3.8:

    PHP Fatal error: Call to a member function getSite() on a non-object 
    

此错误是一类扩展了具有tearDown()方法的上述类,但在这种情况下,该类运行并且错误不同,但与$ this-> container有关:

//In this case, the user doesn't exists 
$site = $this->container->get('security.context') 
     ->getToken()->getUser()->getSite(); 

问题是我不知道这是为什么。如果这与PHP相关,PHPUnit(我们所有人都有相同的版本),Symfony2.0或SO。

编辑:

好了,解决的问题。

第一:

Fatal error: Call to a member function get() on a non-object 

具有代码错线在具有设置()和tearDown()方法的类。一条这样的线:

$link = $crawler->filter('a:contains("Test")')->eq(1)->link(); 

我有这条线评论,对不起:)。但我不知道为什么PHPUnit向我显示这个错误,而不是链接方法的错误。

二:

PHP Fatal error: Call to a member function getSite() on a non-object 

在其他环境中,测试数据库尚未部署。

这个问题不会帮助任何人,但帮助我尝试新事物。谢谢!

+0

尝试检查$ this-> container是否在parent :: setUp()之前有某些内容。也许在parent :: setUp()上做了一些事情,并清理$ this-> container。它也是检查$ this-> client-getContainer()是否带来了一些东西。 – 2013-05-10 09:13:06

+0

我删除了父:: setUp()和错误是一样的。容器始终存在于我的电脑上。在上面的例子中,容器不存在于tearDown()方法中。 – Biruwon 2013-05-10 10:47:49

+0

运行app/check.php来验证您的环境是否正确配置以运行Symfony。 – 2013-05-10 10:58:10

回答

0

这是一个针对PHPUnit的行为。

我设法重现错误与下面的代码:

final class ExceptionErrorTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @var MyObject 
    */ 
    private $object; 

    public function setUp() { 
     throw new \RuntimeException(); 
     $this->object = new MyObject(); 
    } 

    public function testItShouldNeverBeCalled() 
    { 
     var_dump('never called'); 
    } 

    public function tearDown() 
    { 
     $this->object->neverCalled(); 
    } 
} 

class MyObject 
{ 
    public function neverCalled() { 
     return true; 
    } 
} 

// will ouput PHP Fatal error: 
Call to a member function neverCalled() on a non-object in ExceptionErrorTest.php on line 22 

要解释清楚,PHPUnit的将catchsetUp方法引发任何异常(为了使打印机展现在的结束执行)。

之后,您可以see调用tearDown()来完成测试,但由于该属性的初始化从未达到过,因此会发出PHP错误,并且PHPUnit将永远无法到达显示所有异常的代码发生。

这就是为什么你没有得到例外。为了解决这个问题,你需要确保的是,可以在设置抛出异常的任何代码被包装在一个try() catch()声明是这样的:

public function setUp() { 
     try { 
      throw new \RuntimeException('My message'); 
     } catch (\Exception $e) { 
      echo 'An error occured in the setup: ' $e->getMessage(); 
      die; 
     } 

     $this->object = new MyObject(); 
    } 

希望它可以帮助别人的未来。