PHPUnit TeaDownAfterClass 使用 ZendStudio 调用得太快
我在 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',
'[email protected]'
),
array(
'Fred',
'Flintstone',
'Secret Test',
'BarBaz',
'Admin',
'[email protected]'
)
);
}
/**
* 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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好的,我认为这是 ZendStudio 或与其捆绑的 PHPUnit 版本的问题。该测试通过 PEAR 在命令行上安装的 PHPUnit 3.5 运行良好。我已将测试重构为测试数据中的硬代码,而不是使用数据提供程序(我知道,一点也不理想),这暂时解决了问题。
OK, I think this is an issue with either ZendStudio or the version of PHPUnit bundled with it. The test runs fine via a PEAR installed PHPUnit 3.5 on the command line. I've refactored the test to hard code in the test data instead of using a data provider (I know, not ideal at all) and that's fixed things for the time being.