【问题标题】:How to fix Laravel Auth Mocking not working?如何修复 Laravel Auth Mocking 不起作用?
【发布时间】:2021-12-03 16:40:32
【问题描述】:

我正在尝试模拟 Auth 外观,以便可以模拟 Auth::user() 方法。我需要这个,因为我从另一个数据库中获取我的用户。

在生产中,这一切都很好。但是,当我尝试为此编写测试并尝试类似的东西时;

$user = User::factory()->create();
Auth::shouldReceive('user')->andReturn($user);

$response = $this->postJson(route('api.login'), [
    'username' => 'username',
    'password' => 'test-password'
])->assertOk();

我遇到了一个非常奇怪的错误,说实话我什至不确定它是什么意思。

Mockery\Exception\BadMethodCallException: Received Mockery_2_Illuminate_Auth_AuthManager::userResolver(), but no expectations were specified in Mockery/Loader/EvalLoader.php(34) : eval()'d code:927

我在网上几乎没有找到关于此错误的信息,甚至无法真正弄清楚它的含义。希望有人可以提供帮助。

【问题讨论】:

  • 为什么不在你的请求中使用actingAs 而不是自己模拟外观?
  • @BrianThompson 我通常会。但是这个特定的端点正在测试实际的用户/密码登录身份验证本身。我用于此测试的控制器调用 Auth::attempt([]),这是我要模拟的。
  • 我明白了,这很有意义。但我仍然想知道这是否是进行测试的最佳方式。如果您的工厂已经将用户添加到数据库中,Auth::attempt 将加载该用户记录而无需模拟。然后你的断言可以在 JSON 响应或类似的东西上。
  • @BrianThompson 你是对的,测试这一点的方法是使用具有正确数据的工厂,然后让 Auth 使用该数据库(用户所在的位置)来验证用户......如果您正在使用 2 个不同的数据库,不用担心,您必须有 2 个本地数据库,一个用于测试,第二个是“远程测试数据库”,因此您可以假连接到外部数据库,一切仍然有效......作者,添加更多信息,因为您的解决方案不是模拟身份验证,有更好的解决方案,但我们需要更多信息。

标签: laravel phpunit mockery


【解决方案1】:

在嘲弄中,你有部分模拟,它只模拟指定的方法,让其他一切都溜走。我发现issues 表明这也存在于Laravel 中用于外墙,有点旧所以不确定但值得一试。

Auth::shouldReceive('user')->andReturn($user);
Auth::makePartial();

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2021-01-20
    • 2016-04-01
    • 2018-01-03
    • 2015-04-29
    相关资源
    最近更新 更多