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

时间:2015-11-04 21:44:30

标签: php unit-testing laravel-5.1

我对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 个答案:

答案 0 :(得分:2)

最简单的方法是使用Mockery in the Facade

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
        ]);
}

答案 1 :(得分: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);
    }
}

actAs辅助方法。提供了一种将给定用户作为当前用户进行身份验证的简单方法。

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

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

答案 2 :(得分:0)

这太棒了,我们可以移动到TestCase类的所有测试用例,我们可以给出一个名字,如下所示:

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

      $this->be($user);
}

当我们需要经过身份验证的用户时,我们可以调用loginWithFakeUser来假装用户。