Laravel 5.1单元测试中的用户认证

4

我对Laravel 5.1中的单元测试有些困惑。

我想要测试用户账户中设置项的更新。我使用phpunit进行测试。

这是我的测试案例。

/** @test */
    public function it_updates_personal_details(){

        $this->withoutMiddleware();
        $this->visit('/account/settings')
            ->post('/account/settings', ["firstname"=>"RingoUpdated", 'lastname'=>"RingyUpdated", "username"=>"ringo", "bio"=>"My Personal Information", "facebook"=>"myFbUsername", "twitter"=>"myTwUsername", ])
            ->seeJson([
                "signup"=>true
            ]);
    }

但是在我的控制器中,我使用Auth::id()获取当前已登录用户的id。如何在Laravel 5.1中模拟这个呢?

3个回答

7
最简单的方法是利用Facade中的Mockery
public function it_updates_personal_details(){
    Auth::shouldReceive('id')->andReturn(1);

    $this->withoutMiddleware();
    $this->visit('/account/settings')
        ->post('/account/settings', ["firstname"=>"RingoUpdated", 'lastname'=>"RingyUpdated", "username"=>"ringo", "bio"=>"My Personal Information", "facebook"=>"myFbUsername", "twitter"=>"myTwUsername", ])
        ->seeJson([
            "signup"=>true
        ]);
}

运行测试时,我正在创建一个测试用户。有没有办法获取该用户的“id”? - user1012181
你可以像这样做(虽然不太美观,但是可行):Auth::shouldReceive('id')->andReturn(DB::table('users')->orderBy('id', 'desc')->first(['id'])->id); - 请记住我没有测试过这个代码,但是应该能够获取最后创建用户的ID。 - samlev
实际上...那可能行不通。它会获取你添加新用户之前的最后一个用户。 - samlev
有没有其他的方法可以做到这一点? - user1012181
很难说,不知道你的架构或者你正在调用的函数。你可以使用那个方法,但是在结果上加1,并假装这是正确的(甚至更不理想)。这真的取决于你实际上是如何创建用户等等。 - samlev
我尝试了这个:$this->be(\App\User::where('username', 'ringo')->first()); 看起来它能正常工作。 - user1012181

3
这很棒,我们可以将所有测试案例移动到TestCase类中,并给它们命名,就像这样:

TestCase类示例如下:

public function loginWithFakeUser()
{
      $user = new User([
        'id' => 1,
        'name' => 'yish'
      ]);

      $this->be($user);
}

当我们需要验证用户时,可以调用loginWithFakeUser来模拟用户。


使用这个代码,我在这一行得到了一个“Call to a member function guard() on null”错误:$this->app['auth']->guard($driver)->setUser($user);。这是在Laravel 5.8中的问题。 - Bird87 ZA

0

actingAs助手方法。Laravel 5.3

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

use App\User; // user model

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = User::find(1); // find specific user

        $this->actingAs($user)
             ->visit('/')
             ->see('Hello, '.$user->name);
    }
}

actingAs助手方法提供了一种简单的方式,将给定用户认证为当前用户。

您还可以使用模型工厂生成和验证用户:

        $user = factory(App\User::class)->create();
        $this->actingAs($user)
         ->visit('/')
         ->see('Hello, '.$user->name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接