gpt4 book ai didi

php - 如何使用 Mockery 在 Lumen 中使用模拟

转载 作者:行者123 更新时间:2023-12-04 13:45:20 25 4
gpt4 key购买 nike

如何在流明框架中使用模拟?
我使用流明框架。 lumen的文档很简单。我不知道如何使用 mockery 或 facades 来模拟模型。我尝试了一些方法,但没有人奏效。我想在 updatePassword 方法中模拟 UserModel 的两点。
请帮我。

用户模型

use Illuminate\Database\Eloquent\Model;
class UserModel extends Model {
// connection
protected $connection = 'db_user';
// table
protected $table = 'user';
// primarykey
protected $primaryKey = 'id';
}

用户逻辑
class UserLogic {
public static updatePassword($id, $password) {
// find user
$user = UserModel::find($id); // mock here**************************************
if (empty($user)) {
return 'not find user';
}
// update password
$res = UserModel::where('id', $id)
->update(['password' => $password]); // mock here*****************************
if (false == $res) {
return 'update failed';
}
// re Login
$res2 = LoginModel::clearSession();
if (false == $res2) {
return false;
}
return true;
}
}

phpunit 测试 1 不起作用
use Mockery;
public function testUpdatePassword() {
$mock = Mockery:mock('db_user');
$mock->shouldReceive('find')->andReturn(false);
$res = UserLogic::updatePassword(1, '123456');
$this->assertEquals('not find user', $res);
}

php单元测试2
// BadMethodCallException: Method Mockery_0_Illuminate_DatabaseManager::connection() does not exist on this mock object
use Illuminate\Support\Facades\DB;
public function testUpdatePassword() {
DB::shouldReceive('select')->andReturnNull();
$res = UserLogic::updatePassword(1, '123456');
$this->assertEquals('not find user', $res);
}

phpunit test 3 不起作用
use Mockery;
public function testUpdatePassword() {
$mock = Mockery::mock('alias:UserModel');
$mock->shouldReceive('find')->andReturn(null);
$res = UserLogic::updatePassword(1, '123456');
$this->assertEquals('not find user', $res);
}

最佳答案

尝试这个:

    $mock = Mockery::mock('alias:\NamespacePath\To\UserModel');
$mock->shouldReceive('find')->andReturn(null);
$this->app->instance('\NamespacePath\To\UserModel', $mock);
请注意,当您要模拟公共(public)静态函数时,请使用关键字 alias .如果你想模拟一个对象(用 new 创建),你可以使用关键字 overload相反( What is the difference between overload and alias in Mockery? )。
我在使用模拟时遇到的另一个困难是,我们仍然在其他测试中使用它们,在这些测试中我不想再使用模拟,这导致测试失败。模拟持久性与类的加载有关。这在全局范围内发生一次,并一直持续到测试过程终止(从这里: https://blog.gougousis.net/mocking-static-methods-with-mockery/ )。因此,无论首先出现什么(使用类作为模拟或真实的东西)都将定义类的调用方式,之后您不能再更改它。在我之前链接了几行的博客文章中,Alexandros Gougousis 讨论了如何通过在自己的进程中运行模拟测试并禁用全局状态保存来规避这个问题。我尝试了他的方法,但遇到了一些问题,但我也没有花那么多时间。为什么不?因为我找到了一个不同的解决方案:在 phpunit.xml设置变量 processIsolation="true" .这解决了问题。我应该注意到这将每个测试的持续时间增加了大约。 0.5s 所以如果你让它运行 Alexandros 方法可能会更有效,因为它只会在他们自己的进程中运行带有模拟的测试。
旁注:这也适用于 Lumen TestCase 作为测试的基类。

关于php - 如何使用 Mockery 在 Lumen 中使用模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49641751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com