也许现在使用Behat 3就可以了。
我知道使用PHPUnit,我可以使用startUp和tearDown方法达到类似的效果。
我尝试使用@BeforeScenario和@AfterScenario注释钩住开始和回滚事务,但似乎behat和应用程序没有共享相同的实体管理器实例。
有什么建议吗?
谢谢。
更新
感谢您所有人的建议。以下是一些新的考虑:
- 加载固件:是的,它有效。我能够在我的测试开始之前运行固件,但问题(我的问题没有提到)是固件有时需要几分钟才能加载,等待10分钟或更长时间很麻烦。 - BEGIN / ROLLBACK TRANSACTION:它也有效或似乎有效。我没有收到错误,但测试期间编写的数据仍然存在于我的数据库中。我在一个标记有@BeforeScenario的方法中添加了第一个,在一个标记有@AfterScenario的方法中添加了后者。
$this->kernel->getContainer() ->get('doctrine.orm.entity_manager') ->getConnection() ->beginTransaction(); $this->kernel->getContainer() ->get('doctrine.orm.entity_manager') ->getConnection() ->rollBack();- SAVEPOINT:我认为这正是我所需要的,但我的数据仍然存在。我尝试在我的@BeforeScenario方法中添加保存点的创建,在我的@AfterScenario方法中添加回滚。```php // 获取实体管理器的数据库连接对象 $connection = $this->kernel->getContainer()->get('doctrine.orm.entity_manager')->getConnection(); // 开启一个事务 $connection->beginTransaction(); // 在当前事务中创建一个保存点,名称为"tests" $connection->createSavepoint('tests'); ```
```php public function rollback(AfterScenarioScope $scope) { // 获取实体管理器的数据库连接对象 $connection = $this->kernel->getContainer()->get('doctrine.orm.entity_manager')->getConnection(); // 回滚到之前创建的名为"tests"的保存点 $connection->rollbackSavepoint('tests'); } ```
这些测试用例是用于测试我的REST API项目。考虑到这些情况,我认为Behat和我的应用程序在测试期间没有共享相同的实体管理器实例。您能否在测试期间将完全相同的实例在测试和项目之间共享?
Fixtures
,你会找到许多例子。除此之外,还有许多Behat的例子。 - BentCoder