我有代码。
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(),
]);
我该怎么做?谢谢。
答案 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');
}