I'm still working on PHP unit tests for testing my symfony2 controllers. My test classes are derivations of WebTestCase and the tests are doing GET or POST requests do check if everything works fine. I want to test all underlying layers, but I don't want to mess up my database with the tests. I don't want to use mock ups, but an in-memory SQLite db, where I can set up a test scenario to check all modifications. I found a lot of hints how to do this with doctrine 1.x, but they don't work any more. So I want something like this:
class BlahblahTest extends WebTestCase {
public function testXXXYYY() {
// 1. Setup a new database with SQLite:memory:
// 2. create the database and all tables according the entities in my project
$this->createTestScenario(); // 3.
$crawler = $this->client->request('GET', '/testpage'); // 4.
// 5. Lots of checks against the database and / or the $crawler data
}
}
Any chance to get this work?
Thanks in advance Hennes
I never used in memory sqlite database but for testing i do use a sqlite database that is saved.
For that you should add
# app/config/config_test.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_sqlite
path: %kernel.cache_dir%/test.db
To your test config (for me config_test.yml)
You should be able to change this to in memory according to the documentation
memory (boolean): True if the SQLite database should be in-memory (non-persistent). Mutually exclusive with path. path takes precedence.
So the config should then be
# app/config/config_test.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_sqlite
memory: true
You can easily create entitymanager instance your self. Check this helper class You probably don't have it in symfony 2 but you can use the idea to build your own base testCaseClass and use it when needed. This even does not require to boot kernel.
The accepted answer didn't work for me, because I was using the URL to specify the connection parameters, and althogh I was setting the driver to pdo_sqlite
and memory
to true
, Doctrine was still using the url
parameter from the root configuration, so I had to overwrite it.
#api/config/packages/test/doctrine.yaml
doctrine:
dbal:
url: "sqlite:///:memory:"
来源:https://stackoverflow.com/questions/23537549/symfony-doctrine-unittests-with-sqlite-memory-db