Beim Schreiben von Unit-Tests in Laravel kommt es häufig vor, dass Sie authentifizierte Benutzer simulieren müssen, z. B. beim Erstellen neuer Artikel oder beim Erstellen Bestellungen usw. Wie implementiert man es also im Laravel-Unit-Test?
Offizielle Lösung
Es wird im Testkapitel in der offiziellen Dokumentation von Laravel erwähnt:
Natürlich besteht eine häufige Verwendung der Sitzung darin, den Status für den authentifizierten Benutzer aufrechtzuerhalten. Die Hilfsmethode „ActingAs“ bietet eine einfache Möglichkeit, einen bestimmten Benutzer zu authentifizieren user als aktuellen Benutzer verwenden. Beispielsweise können wir eine Modellfabrik verwenden, um einen Benutzer zu generieren und zu authentifizieren: code> Trait > und be
Methoden.
Nach dem Festlegen können wir im nachfolgenden Testcode den aktuell authentifizierten Benutzer über Methoden wie auth()->user()
abrufen. IlluminateFoundationTestingConcernsImpersonatesUsers
Trait 中的 actingAs
和 be
方法。
设置以后在后续的测试代码中,我们可以通过 auth()->user()
等方法来获取当前认证的用户。
伪造认证用户
在官方的示例中有利用 factory 来创建一个真实的用户,但是更多的时候,我们只想用一个伪造的用户来作为认证用户即可,而不是通过 factory 来创建一个真实的用户。
在 tests 目录下新建一个 User
calss:
<?php use App\User; class ExampleTest extends TestCase { public function testApplication() { $user = factory(User::class)->create(); $response = $this->actingAs($user) ->withSession(['foo' => 'bar']) ->get('/'); } }
必须在 $fillable
中添加 id
attribute . 否则会抛出异常: IlluminateDatabaseEloquentMassAssignmentException: id
Benutzer
-Klasse im Testverzeichnis:Als nächstes fälschen Sie einen Benutzerauthentifizierungsbenutzer:Sie müssen dasuse Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { protected $fillable = [ 'id', 'name', 'email', 'password', ]; }Nach dem Login kopierenid
-Attribut in$fillable
hinzufügen. Andernfalls eine Ausnahme wird geworfen:IlluminateDatabaseEloquentMassAssignmentException: id