I am tesing now my Laravel app and facing the next problem: my project was migrated from a no-framework PHP project, which already has its own database, so I do no have migrations for most of db data. During the testing I need to refresh my database, but as far as I now, when I use use RefreshDatabase;
my whole database is being refreshed(so the tables are being dropped as well), so laravel supposes, that I am migrating my db tables every time, what I am not doing. So the question is: is it possible for every new test to refresh just the records( I mean delete them), but not the whole database ? I've googled it and unfortunately did not find something, which might help. Thanks in advance!
Asked
Active
Viewed 5,856 times
6

handkock
- 1,067
- 2
- 11
- 23
-
1You can create a `Trait` to `TRUNCATE` all your database table for your testing. For reference, check this answer: https://stackoverflow.com/a/50904595/4369919 – N69S Aug 19 '19 at 10:22
3 Answers
9
If you are using Phpunit
you can use DatabaseTransactions
it will add to the database what you added in tests and after that, it will delete it. Just use it like a trait.
If you don't want to create a testing database it's easy way like this:
<?php
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
use DatabaseTransactions;
...
You can find more about that in the docs.

mare96
- 3,749
- 1
- 16
- 28
-
-
-
One issue with `DatabaseTransactions` is that unit tests might still assume the DB is non-empty or contains specific records which aren't created in migrations but _are_ present in the real, deployed DBs. I'd prefer to stand up a test DB as part of running the tests. – Sarah Messer Feb 24 '23 at 16:51
3
You have to set your testing DB on memory so it will not affect your main database for every test. Just change the phpunit.xml file like below:
<php>
<env name="APP_ENV" value="testing"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="MAIL_DRIVER" value="array"/>
</php>

Tohid Dadashnezhad
- 1,808
- 1
- 17
- 27
-
2For sure you need use separate DB for unit testing. But you need after test reset you tables, as each test is unique. – GrigorAtaryan Nov 26 '21 at 12:32
0
you need to set a different environment for your testing. please look at this. https://laravel.com/docs/5.8/testing#environment and when you test your code the testing will be done on the test environment
and I guess you need a migration to run your old database fields.

KevDev
- 541
- 2
- 6
- 20