PHPUnit 中的 setup() 和 Codeception 中的 _before 有什么区别

What is the difference between setup() in PHPUnit and _before in Codeception

我正在学习 Codeception,我想知道什么时候应该使用 setUp() 或 tearDown() 以及什么时候应该使用 _before() 或 _after()。 我看不出有什么区别。这两种方法都是 运行 在我的测试文件中的单个测试之前或之后? 谢谢,

正如 Gabriel Hemming 所提到的,setUp() 和 tearDown() 是 PHPUnit 在每次测试之前设置环境的方式 运行 以及在每次测试之后拆除环境的方式 运行。 _before() 和 _after() 是 codeception 的处理方式。

为了回答你的问题,关于为什么 codeception 有不同的方法集,我建议你参考 codeception 的文档:http://codeception.com/docs/05-UnitTests#creating-test

As you see, unlike in PHPUnit, the setUp and tearDown methods are replaced with their aliases: _before, _after.

The actual setUp and tearDown are implemented by the parent class \Codeception\TestCase\Test and set the UnitTester class up to have all the cool actions from Cept-files to be run as a part of your unit tests.

文档中提到的酷动作是现在可以在您的单元测试中使用的任何模块或助手 类。

这里有一个很好的例子,说明如何在单元测试中使用模块: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;
            }
        }

    }
}