如何在Laravel 5.2模型中模拟Auth

Raa*_*ath 0 php unit-testing model mocking laravel-5

我正在尝试为一个全新的迷你应用程序编写一些单元测试。我通常会编写功能测试,因此这是我的工作,可以尝试通过模拟和存根以及所有与代码有关的事情正确地进行操作。

该模型如下所示:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Auth;

class myModel extends Model
{
    public static function getUser()
    {
        $user = \Auth::user();
        return $user->adldapUser->cn[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

和测试:

class MyModelTest extends TestCase
{

    public function testGetUser()
    {
        $mockResult = new StdClass();
        $mockResult->adldapUser = new stdClass();
        $mockResult->adldapUser->cn=array("test");
        $auth = $this->getMock('Auth');
        $auth
            ->method('user')
            ->will($this->returnValue($mockResult));

        $this->assertEquals('test',\App\MyModel::getUser());
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行单元测试时,出现以下错误消息:

有1个错误:

1)MyModelTest :: testGetUser ErrorException:试图获取非对象的属性

/home/aidan/web/vagrant-web-dev/src/apps/orcid/app/MyModel.php:61 /home/aidan/web/vagrant-web-dev/src/apps/orcid/tests/MyModelTest.php :18

如果我发布$ user,则为NULL。

我在这里做错了什么?

Raa*_*ath 5

在问了半小时之后,我再次在这里回答我自己的问题。

为了繁荣,我将其留在这里。

答案是在这篇文章在这里:https : //stackoverflow.com/a/17602763/808124

所以我用$ this-> getMock替换了

Auth::shouldReceive('user')->once()->andreturn($mockResult);
Run Code Online (Sandbox Code Playgroud)

工作中


小智 5

我这样使用它:

$user -factory(User:class)->create();
\Auth::shouldReceive('guard')->andReturnSelf()
         ->shouldReceive('user')->andReturn($user)
         ->shouldReceive('check')->andReturn(true);
Run Code Online (Sandbox Code Playgroud)