预期异常phpunit后继续测试

时间:2019-09-25 17:02:13

标签: php exception transactions phpunit

我有代码。

        try {
            $this->entityManager->beginTransaction();

            $this->repo->remove($something);
            $this->repoTwo->delete($something);

            $this->entityManager->commit();
        } catch (Exception $e) {
            $this->entityManager->rollback();

            throw new Exception($e->getMessage(), 0, $e);
        }

现在,我想测试,如果在异常发生后数据库中仍然有记录,我应该怎么做,如果在异常发生后测试无法正常工作?

    $this->expectException(Exception::class);
    $this->expectExceptionMessage('xxxx');

    app(Command::class)->handle();

    $this->seeInDatabase($table, [
        'id' => $media->id(),
    ]);

我该怎么做?谢谢。

1 个答案:

答案 0 :(得分:0)

通常,您可以创建两个测试。抛出了一个测试异常的测试,并且在第一个测试中测试了depends并测试记录的异常仍然存在,但是在这种情况下,该数据库将在每次测试之前重置,包括测试依赖项,因此您无法正常使用可能会发生。

但是您仍然可以执行两个测试,并且其中一个依赖另一个,但是您需要在两个测试中重新运行相同的代码(因为在两次测试之间将重置数据库)。在这种情况下,“依赖”只是证明一个测试与另一个测试相关联。

public function testOne()
{
    $this->expectException(Exception::class);
    $this->expectExceptionMessage('xxxx');

    app(Command::class)->handle();
}

/**
 * @depends testOne
 */
public function testTwo($arg)
{
    app(Command::class)->handle();

    $this->seeInDatabase($table, [
        'id' => $media->id(),
    ]);
}

如果您真的想进行端到端测试,并在同一测试中进行断言,则可以使用try ... catch块并对其进行程序测试。

public function testException()
{
    try {
        app(Command::class)->handle();
    } catch (\Exception $e) {
        // Make sure you catch the specific exception that you expect to be
        // thrown, (e.g. the exception you would normally specify in the
        // expectException method: $this->expectException(Exception::class);

        // Assert the exception message.
        $this->assertEquals('xxxx', $e->getMessage());

        // Assert database still contains record.
        $this->seeInDatabase($table, [
            'id' => $media->id(),
        ]);

        return;
    }

    // If the expected exception above was not caught then fail the test.
    $this->fail('optional failure message');
}