Testing | laravel-permission | Spatie

 SPATIE

  Laravel Permission
=====================

spatie.be/open-source

  [Docs](https://spatie.be/docs)  [Laravel-permission](https://spatie.be/docs/laravel-permission/v4)  Advanced-usage  Testing

 Version   v7   v6   v5   v4   v3

 Other versions for crawler [v7](https://spatie.be/docs/laravel-permission/v7) [v6](https://spatie.be/docs/laravel-permission/v6) [v5](https://spatie.be/docs/laravel-permission/v5) [v4](https://spatie.be/docs/laravel-permission/v4) [v3](https://spatie.be/docs/laravel-permission/v3)

- [ Introduction ](https://spatie.be/docs/laravel-permission/v4/introduction)
- [ Support us ](https://spatie.be/docs/laravel-permission/v4/support-us)
- [ Prerequisites ](https://spatie.be/docs/laravel-permission/v4/prerequisites)
- [ Installation in Laravel ](https://spatie.be/docs/laravel-permission/v4/installation-laravel)
- [ Installation in Lumen ](https://spatie.be/docs/laravel-permission/v4/installation-lumen)
- [ Upgrading ](https://spatie.be/docs/laravel-permission/v4/upgrading)
- [ Questions and issues ](https://spatie.be/docs/laravel-permission/v4/questions-issues)
- [ Changelog ](https://spatie.be/docs/laravel-permission/v4/changelog)
- [ About us ](https://spatie.be/docs/laravel-permission/v4/about-us)

Basic Usage
-----------

- [ Basic Usage ](https://spatie.be/docs/laravel-permission/v4/basic-usage/basic-usage)
- [ Direct Permissions ](https://spatie.be/docs/laravel-permission/v4/basic-usage/direct-permissions)
- [ Using Permissions via Roles ](https://spatie.be/docs/laravel-permission/v4/basic-usage/role-permissions)
- [ Wildcard permissions ](https://spatie.be/docs/laravel-permission/v4/basic-usage/wildcard-permissions)
- [ Blade directives ](https://spatie.be/docs/laravel-permission/v4/basic-usage/blade-directives)
- [ Defining a Super-Admin ](https://spatie.be/docs/laravel-permission/v4/basic-usage/super-admin)
- [ Using multiple guards ](https://spatie.be/docs/laravel-permission/v4/basic-usage/multiple-guards)
- [ Using artisan commands ](https://spatie.be/docs/laravel-permission/v4/basic-usage/artisan)
- [ Using a middleware ](https://spatie.be/docs/laravel-permission/v4/basic-usage/middleware)
- [ Example App ](https://spatie.be/docs/laravel-permission/v4/basic-usage/new-app)

Best Practices
--------------

- [ Roles vs Permissions ](https://spatie.be/docs/laravel-permission/v4/best-practices/roles-vs-permissions)
- [ Model Policies ](https://spatie.be/docs/laravel-permission/v4/best-practices/using-policies)
- [ Performance Tips ](https://spatie.be/docs/laravel-permission/v4/best-practices/performance)

Advanced usage
--------------

- [ Testing ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/testing)
- [ Database Seeding ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/seeding)
- [ Exceptions ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/exceptions)
- [ Extending ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/extending)
- [ Cache ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/cache)
- [ UUID ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/uuid)
- [ PhpStorm Interaction ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/phpstorm)
- [ Other ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/other)
- [ Timestamps ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/timestamps)
- [ UI Options ](https://spatie.be/docs/laravel-permission/v4/advanced-usage/ui-options)

      You are viewing the documentation for **an older version** of this package. You can check the version you are using with the following command:

 `                                    composer show spatie/laravel-permission                                                                                                                                                                                                                                    `

Testing
=======

###  On this page

1. [ Clear Cache During Tests ](#content-clear-cache-during-tests)
2. [ Factories ](#content-factories)

Clear Cache During Tests
--------------------------------------------------------------------------------------------------------------------------------

In your application's tests, if you are not seeding roles and permissions as part of your test `setUp()` then you may run into a chicken/egg situation where roles and permissions aren't registered with the gate (because your tests create them after that gate registration is done). Working around this is simple:

In your tests simply add a `setUp()` instruction to re-register the permissions, like this:

```
    public function setUp(): void
    {
        // first include all the normal setUp operations
        parent::setUp();

        // now re-register all the roles and permissions (clears cache and reloads relations)
        $this->app->make(\Spatie\Permission\PermissionRegistrar::class)->registerPermissions();
    }
```

Factories
-----------------------------------------------------------------------------------

Many applications do not require using factories to create fake roles/permissions for testing, because they use a Seeder to create specific roles and permissions that the application uses; thus tests are performed using the declared roles and permissions.

However, if your application allows users to define their own roles and permissions you may wish to use Model Factories to generate roles and permissions as part of your test suite.

With Laravel 7 you can simply create a model factory using the artisan command, and then call the `factory()` helper function to invoke it as needed.

With Laravel 8 if you want to use the class-based Model Factory features you will need to `extend` this package's `Role` and/or `Permission` model into your app's namespace, add the `HasFactory` trait to it, and define a model factory for it. Then you can use that factory in your seeders like any other factory related to your app's models.
