Codeception / Codeception/module-laravel

Laravel facades are reset between functional test requests

Aperta
#18 1 commento 1 reazione 0 assegnatari Vedi su GitHub
Lingua principale
PHP
Stelle
6
Fork
13
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Hi,

Using the Laravel module for testing a website, the Notification facade is firstly [set to be a mock](https://laravel.com/docs/5.4/mocking#notification-fake).
Then, when sending a request, this setting is unset through a call to Facade::clearResolvedInstances().

Here is an extract from the stack trace :
```txt
#0 Illuminate\Support\Facades\Facade::clearResolvedInstances() called at [/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterFacades.php:19]
Codeception/Codeception#1 Illuminate\Foundation\Bootstrap\RegisterFacades->bootstrap() called at [/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:208]
Codeception/Codeception#2 Illuminate\Foundation\Application->bootstrapWith() called at [/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:162]
Codeception/Codeception#3 Illuminate\Foundation\Http\Kernel->bootstrap() called at [/var/www/vendor/codeception/codeception/src/Codeception/Lib/Connector/Laravel5.php:187]
Codeception/Codeception#4 Codeception\Lib\Connector\Laravel5->initialize() called at [/var/www/vendor/codeception/codeception/src/Codeception/Lib/Connector/Laravel5.php:100]
Codeception/Codeception#5 Codeception\Lib\Connector\Laravel5->doRequest() called at [/var/www/vendor/symfony/browser-kit/Client.php:316]
Codeception/Codeception#6 Symfony\Component\BrowserKit\Client->request() called at [/var/www/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php:195]
Codeception/Codeception#7 Codeception\Lib\InnerBrowser->clientRequest() called at [/var/www/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php:848]
Codeception/Codeception#8 Codeception\Lib\InnerBrowser->proceedSubmitForm() called at [/var/www/vendor/codeception/codeception/src/Codeception/Lib/InnerBrowser.php:859]
Codeception/Codeception#9 Codeception\Lib\InnerBrowser->submitForm()
```

And here is a sample code leading to it :
```php
$I = new FunctionalTester($scenario);

Notification::fake();
var_dump(get_class(Notification::getFacadeRoot())); // string(49) "Illuminate\Support\Testing\Fakes\NotificationFake"
$user = \App\User::first();
$I->amOnAction('App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm');
$I->submitForm('[action$="/auth/reset/request"]', [
'email' => $user->email
]);
var_dump(get_class(Notification::getFacadeRoot())); // string(39) "Illuminate\Notifications\ChannelManager"
Notification::assertSentTo($user, App\Notifications\Notification::class);
```

Leading to the final error : `[Error] Call to undefined method Illuminate\Notifications\Channels\MailChannel::assertSentTo()` ("ChannelManager" looks inside "MailChannel" if it doesn't have the method)

`Notification::fake` couldn't be called again since [it creates a new instance](https://github.com/laravel/framework/blob/5.4/src/Illuminate/Support/Facades/Notification.php#L20) and would lose the previous data.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia da Codeception/Lib/Connector/Laravel5.php, in particolare da initialize() e doRequest(), e confronta quel flusso di richiesta con il bootstrap RegisterFacades di Laravel mostrato nello stack trace. Riproduci la sequenza Notification::fake() e submitForm(), quindi verifica che la facade rimanga il fake dopo la richiesta e che assertSentTo() possa essere eseguito senza l'errore MailChannel.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
laravel, php
Ambito
backend, testing
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.