我正在学习Codeception,我想知道何时应该使用setUp()或tearDown()以及何时应该使用_before()或_after()。 我没有看到任何区别。这两种方法都在我的测试文件中的单个测试之前或之后运行? 谢谢,
答案 0 :(得分:3)
正如Gabriel Hemming所提到的,setUp()和tearDown()是PHPUnit在每次测试运行之前设置环境的方法,并在每次测试运行后拆除环境。 _before()和_after()是代码转换的方式。
要回答你的问题,为什么代码检查有不同的方法集,请让我参考代码集的文档:http://codeception.com/docs/05-UnitTests#creating-test
如您所见,与PHPUnit不同,setUp和tearDown方法将替换为其别名:_before,_after。
实际的setUp和tearDown由父类\ Codeception \ TestCase \ Test实现,并将UnitTester类设置为将Cept文件中的所有酷动作作为单元测试的一部分运行。
文档所指的酷动作是现在可用于单元测试的任何模块或辅助类。
以下是如何在单元测试中使用模块的一个很好的示例:http://codeception.com/docs/05-UnitTests#using-modules
让我们举一个在单元测试中设置灯具数据的例子:
<?php
class UserRepositoryTest extends \Codeception\Test\Unit
{
/**
* @var \UnitTester
*/
protected $tester;
protected function _before()
{
// Note that codeception will delete the record after the test.
$this->tester->haveInDatabase('users', array('name' => 'miles', 'email' => 'miles@davis.com'));
}
protected function _after()
{
}
// tests
public function testUserAlreadyExists()
{
$userRepository = new UserRepository(
new PDO(
'mysql:host=localhost;dbname=test;port=3306;charset=utf8',
'testuser',
'password'
)
);
$user = new User();
$user->name = 'another name';
$user->email = 'miles@davis.com';
$this->expectException(UserAlreadyExistsException::class);
$user->save();
}
}
class User
{
public $name;
public $email;
}
class UserRepository
{
public function __construct(PDO $database)
{
$this->db = $database;
}
public function save(User $user)
{
try {
$this->db->prepare('INSERT INTO `users` (`name`, `email`) VALUES (:name, :email)')
->execute(['name' => $user->name, 'email' => $user->email]);
} catch (PDOException $e) {
if ($e->getCode() == 1062) {
throw new UserAlreadyExistsException();
} else {
throw $e;
}
}
}
}