【问题标题】:Mock Auth::user() in Laravel 6Laravel 6 中的模拟 Auth::user()
【发布时间】:2020-06-09 02:12:13
【问题描述】:

我有这个代码:

// ...
Passport::actingAs($this->user);
$mock = Mockery::mock(User::class);
$mock->shouldReceive('myMethodName')->andReturn(157);
Auth::shouldReceive('user')->once()->andReturn($mock);

如果我打电话

Auth::user()->myMethodName(); // It returns 157

但如果我调用(或另一种 Auth 方法)

  Auth::id();
  // it throws Mockery\Exception\BadMethodCallException : Method Mockery_2_Illuminate_Auth_AuthManager::id() does not exist on this mock object

问题出在哪里?

【问题讨论】:

  • 尝试将其添加到基本测试用例的setUp 方法中:\Mockery::getConfiguration()->allowMockingNonExistentMethods(false);
  • 我试过这个。所以我有另一个例外Mockery\Exception : Mockery's configuration currently forbids mocking the method user as it does not exist on the class or object being mocked

标签: php laravel unit-testing mocking


【解决方案1】:

你应该使用Auth() 喜欢:

Auth::user()->id;

【讨论】:

  • 我试过了。还有另一个问题 **Mockery\Exception\BadMethodCallException : 收到了 Mockery_1_App_User::getAttribute(),但没有指定期望 **
【解决方案2】:

终于找到答案了:

$this->user = factory(User::class)->create();
Passport::actingAs($this->user);

$obj = Mockery::mock($this->user)
    ->makePartial()
    ->shouldReceive('myMethodName')
    ->andReturn(123)
    ->getMock();

Auth::setUser($obj);

【讨论】:

    【解决方案3】:

    对于较新版本的 Laravel:

    $user = (new User)->forceFill([
        'name' => 'Their name',
        'email' => 'email@example.com',
    ]);
    
    $user->email
    // output: email@example.com
    

    【讨论】:

    • 这如何解决Auth::user() 的使用问题?不管怎样,你应该使用工厂来创建假模型。
    猜你喜欢
    • 2020-08-14
    • 2019-04-20
    • 1970-01-01
    • 2015-05-13
    • 2017-03-29
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多