Laravel Facades et Mockery: faire de tests sur des méthodes enchaînées
🤔 Comment c'est arrivé?’
J’ai essayé de tester Laravel avec PHPUnit. Et j’ai besoin d’éxecuter les Facades de Laravel. Spécialement, les méthodes enchaînées.
3
namespace App\Http\Controllers;5
use Illuminate\Http\Request;6
use Illuminate\Support\Facades\Storage;8
class ChainController extends Controller10
public function index(Request $request)12
Storage::disk('local')->put('/images/content', $request->file('demo'));14
return response()->json(['success' => true]);
Après ça, mes tests ont échoué car je n’ai peux pas exécuter put sur null . Cela signifiait que disk retourne null, complètement faux.
🔨 La solution
Après que j’en ai recherché. J’ai trouvé la solution dans la documentation de Mockery. Il est utilisé par Laravel pour faire des mocks. La prochaine ligne de code retournera null par défaut et les assertions vont échouer.
3
Storage::disk('s3')->delete('/images/content/demo.png');
Alors, la solution vient depuis une méthode simple de Mockery appelé andReturnSelf . C’est dépend de l’implémentation de la classe, mais les plusieurs méthodes enchaînées retourneront la même classe où ils sont créés. De même, tu pourrais utiliser andReturn et écrire l’objet, la chaîne ou la structure de donnes que les Mocks pourraient retourner.
Dans ce cas, j’ai besoin de andReturnSelf. On verra comment le résultat final fonctionne. Pour le tester, mon ChainController est enchaîneé à la route POST /chain .
3
namespace Tests\Feature;5
use Illuminate\Http\UploadedFile;6
use Illuminate\Support\Facades\Storage;9
class ChainControllerTest extends TestCase11
public function test_using_facades()13
Storage::fake('local');15
Storage::shouldReceive('disk')->once()->with('local')->andReturnSelf();16
Storage::shouldReceive('put')->once()->withSomeOfArgs('/images/content');18
$response = $this->post('/chain', ['demo' => UploadedFile::fake()->image('hello.jpeg')]);19
$response->assertStatus(200);
🔗 Des liens
Tu pourras voir d’exemple,
click ici.