-
Notifications
You must be signed in to change notification settings - Fork 638
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
transaction option in codeception doesn't roll back database changes made in tests. #7615
Comments
Currently my workaround for this is a custom extension that starts a transaction before a test and rolls everything back afterwards. tests/_support/TransactionExtension.php <?php
use Codeception\Events;
use yii\db\Transaction;
class TransactionExtension extends \Codeception\Extension
{
/**
* @var Transaction
*/
protected $transaction;
public static $events = array(
Events::TEST_BEFORE => 'beforeTest',
Events::TEST_AFTER => 'afterTest',
);
// methods that handle events
public function beforeTest(\Codeception\Event\TestEvent $e) {
$this->transaction = \Craft::$app->getDb()->beginTransaction();
}
public function afterTest(\Codeception\Event\TestEvent $e)
{
$this->transaction->rollBack();
}
} tests/integration.suite.yml # Codeception Test Suite Configuration
#
# Suite for unit or integration tests.
actor: UnitTester
extensions:
enabled: [TransactionExtension]
modules:
enabled:
- \craft\test\Craft
- Asserts
- \Helper\Unit |
Ok new update. Seems like this is happening because the The above workaround was actually interfering with fixtures as well, so what I ended up doing to get everything (fixtures, projectConfig, transactions) working together is manually triggering a tests/_support/Helper/MyModule.php <?php
namespace Helper;
use Codeception\TestInterface;
use craft\test\Craft;
use yii\db\Connection;
class MyModule extends Craft
{
public function _before(TestInterface $test)
{
parent::_before($test);
\Craft::$app->getDb()->trigger(Connection::EVENT_AFTER_OPEN);
}
} codeception.yml actor: Tester
paths:
tests: tests
log: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
bootstrap: _bootstrap.php
params:
- tests/.env
modules:
config:
\Helper\MyModule:
configFile: "tests/_craft/config/test.php"
entryUrl: "http://host.docker.internal/index.php"
projectConfig: {
folder: "config/project",
reset: false
}
migrations: []
plugins: []
cleanup: true
transaction: true
dbSetup: { clean: true, setupCraft: true } |
Thanks for that... there probably is some wonkiness here we'll have to look into, either in Yii2's codeception module or how we're extending it. |
I'm gonna close this. For anybody else finding themselves here I ended up just replacing codeception entirely with craft-pest. Way simpler to setup and transactions work great. |
Ok looping back to this. Pest is fantastic, but it's also missing some great bells and whistles that Codception comes with. Just opened a pull request to actually try and address the underlying issue. |
Thanks for the PR - tested and merged. It will be included in the next release! |
Craft 5.2.7 is out with this. Thanks again! |
Description
I'm noticing that even though I'm setting
transaction: true
incodeception.yml
, database operations made within tests aren't rolled back after the test is done. Here's the test file i'm running. There's no modules or plugins enabled for this test instance.docker-compose exec php ./vendor/bin/codecept run integration
Steps to reproduce
Additional info
The text was updated successfully, but these errors were encountered: