【问题标题】:PHPUnit tearDownAfterClass called too soon with ZendStudioZendStudio 过早调用 PHPUnit tearDownAfterClass
【发布时间】:2011-04-02 02:13:07
【问题描述】:

我在 Zend Studio 中遇到了一个非常奇怪的 PHPUnit 问题。我有一个使用两种当前测试方法的单元测试。我正在使用 setUpBeforeClass() 和 tearDownAfterClass() 来初始化数据库连接并销毁它。我遇到的问题是在第一个测试方法之后调用了 tearDownAfterClass() 。之后调用 setUp() 时会出现错误,因为当时不存在数据库连接。我这辈子都想不通到底发生了什么。我已经通过使用 ZendDebugger 逐步完成测试来确认问题。我也在使用 ZendStudio 中嵌入的 PHPUnit 版本。下面是测试代码:

    <?php
require_once '../Code\includes\classes\datamapper\basedatamapper.class.php';
require_once '../Code\includes\classes\datamapper\userdatamapper.php';
require_once '../Code\includes\classes\users\user.class.php';
require_once 'PHPUnit\Framework\TestCase.php';

use DataMapper\UserDataMapper, Users\User;

/**
 * UserDataMapper test case.
 */
class UserDataMapperTest extends PHPUnit_Framework_TestCase {
    /**
     * @var UserDataMapper
     */
    private $UserDataMapper;

    protected static $db;

    static public function setUpBeforeClass() {
        self::$db = new PDO('mysql:host=localhost;dbname=cfoundtest', 'root', 'Andrea30Cook');
        self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    /**
     * Prepares the environment before running a test.
     */
    protected function setUp() {
        parent::setUp();
        $this->UserDataMapper = new UserDataMapper(self::$db, simplexml_load_file(dirname(__DIR__) . '/Code/mapping/userMapping.xml')); 
    }   
    /**
     * @dataProvider UserGenerator
     */
    public function testSaveNewUser($firstname, $lastname, $password, $username, $userType, $email) {
        $user = new User();
        $user->setFirstname($firstname)
                ->setLastname($lastname)
                ->setPassword($password)
                ->setUsername($username)
                ->setUserType($userType)
                ->setEmail($email);
        $this->assertTrue($this->UserDataMapper->save($user));
        $this->assertType('int', $user->getId());
        $this->assertType('string', $user->getConfString());
        $this->assertSame(40, strlen($user->getConfString()));
    }
    /**
     * @dataProvider UserGenerator
     */
    public function testAddingUserException($firstname, $lastname, $password, $username, $userType, $email) {
        $user = new User();
        $user->setFirstname($firstname)
                ->setLastname($lastname)
                ->setPassword($password)
                ->setUsername($username)
                ->setUserType($userType)
                ->setEmail($email);
        $this->setExpectedException('InvalidArgumentException', sprintf('Username "%s" is already taken in DataMapper\UserDataMapper::insert', $user->getUsername()));
        $this->UserDataMapper->save($user);
    }

    public static function UserGenerator() {
        return array(
            array(
                'Foo',
                'Bar',
                'Secret Test',
                'Foobar',
                'Authorizer',
                'example@example.com'
            ),
            array(
                'Fred',
                'Flintstone',
                'Secret Test',
                'BarBaz',
                'Admin',
                'example2@example.com'
            )
        );
    }
    /**
     * Cleans up the environment after running a test.
     */
    protected function tearDown() {
        // TODO Auto-generated UserDataMapperTest::tearDown()


        $this->UserDataMapper = null;

        parent::tearDown();
    }

    static public function tearDownAfterClass() {
        self::$db->exec('DELETE FROM failedlogins');
        self::$db->exec('DELETE FROM users');
        self::$db = NULL;
    }
}

【问题讨论】:

    标签: php phpunit zend-studio


    【解决方案1】:

    好的,我认为这是 ZendStudio 或与其捆绑的 PHPUnit 版本的问题。该测试通过在命令行上安装了 PEAR 的 PHPUnit 3.5 运行良好。我已经将测试重构为测试数据中的硬编码,而不是使用数据提供者(我知道,这根本不理想),这暂时是固定的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2011-03-22
      • 2012-10-31
      • 2015-12-04
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多