【发布时间】: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 个本地数据库,一个用于测试,第二个是“远程测试数据库”,因此您可以假连接到外部数据库,一切仍然有效......作者,添加更多信息,因为您的解决方案不是模拟身份验证,有更好的解决方案,但我们需要更多信息。