php - 用 Mockery 模拟 Laravel Model::increment()

标签 php laravel phpunit codeception mockery

我在 Laravel 5 事件处理程序中有一行代码,如下所示:

$this->event->batch->increment('attempted_jobs');

$this->event 是调用处理程序的事件,$this->event->batch 包含我的 Batch 模型。所有这些都会增加我数据库中的 attempted_jobs 列,所以这是相当基本的东西。

我希望能够测试这个事件处理程序,我正在使用 Codeception 和 Mockery。我对 $this->event->batch 的模拟看起来像这样:

$batch = m::mock('MyVendor\MyApp\Batch');
$batch->shouldReceive('increment')->once()->with('attempted_jobs');

然而,这会导致问题 - increment()Model 的 protected 方法,因此不能被模拟。这是确切的错误:

InvalidArgumentException: increment() cannot be mocked as it a protected method and mocking protected methods is not allowed for this mock

它似乎是使用 __call() PHP 魔术方法实现的,那么如何模拟它呢?我尝试创建一个 __call() 模拟,但这会产生大量与未实现的 increment() 方法相关的错误。

最佳答案

问题是因为,如前所述,increment()Illuminate\Database\Eloquent\Model() 的 protected 方法。解决这个问题的方法是直接模拟 __call() 方法,如下所示:

$batch = m::mock('MyVendor\MyApp\Batch');
$batch->shouldReceive('__call')->with('increment')->once();

(我不确定为什么我第一次尝试时它不起作用)

关于php - 用 Mockery 模拟 Laravel Model::increment(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28189285/

相关文章:

php - 从 Controller 访问 Laravel 路由或从路由传递参数到 Controller

php - 将迭代算法应用于数据库中的一组行

php - 将日期时间插入数据库 PHP

php - Laravel:使用 store() 上传时更改文件名

php - Laravel:运行测试时禁用 Artisan 控制台输出

testing - Selenium Webdriver 异常 : waitForPageToLoad is not a valid webdriver command?

java - 如果在 WSDL 中定义了 `xsd:struct` (Key => Value Map),如何处理 Wsdl2Java?

Laravel WhereNotIn 使用多列

phpunit - Laravel 单元测试 - 添加 cookie 到请求?

php - 将 jsonb 列值转换为 PostgreSQL 中的多列