---
title: Testing
extends: _layouts.documentation
section: content
---

# Testing {#testing}

> If you're a sponsor, you can get an opinionated, but automatic testing setup on the site with exclusive content for sponsors: https://sponsors.tenancyforlaravel.com/frictionless-testing-setup

TODO: Review

## Events {#events}

Keep in mind that the package makes heavy use of events, so if you use `Event::fake()` anywhere in your tests, tenancy initialization and related processes might break.

For that reason, try to be selective about faking tests. Use for example:

```php
Event::fake([MyEvent::class]);
```

rather than

```php
Event::fake();
```

## Central app {#central-app}

To test your central app, just write normal Laravel tests.

## Tenant app {#tenant-app}

Note: If you're using multi-database tenancy & the automatic mode, it's not possible to use `:memory:` SQLite databases or the `RefreshDatabase` trait due to the switching of default database.

To test the tenant part of the application, create a tenant in the `setUp()` method and initialize tenancy.

You may also want to do something like this:

```php
class TestCase // extends ...
{
    protected $tenancy = false;

    public function setUp(): void
    {
        parent::setUp();

        if ($this->tenancy) {
            $this->initializeTenancy();
        }
    }

    public function initializeTenancy()
    {
        $tenant = Tenant::create();

        tenancy()->initialize($tenant);
    }

    // ...
}
```

And in your individual test cases:

```php
class FooTest extends TestCase
{
    protected $tenancy = true;

    /** @test  */
    public function some_test()
    {
        $this->assertTrue(...);
    }
}
```

Or you may want to create a separate TestCase class for tenant tests, for better organization.
