代码之家  ›  专栏  ›  技术社区  ›  edcs

用Mockry模拟Laravel模型::increment()

  •  3
  • edcs  · 技术社区  · 10 年前

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

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

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

    我希望能够测试这个事件处理程序,我正在使用Codeception和Mockry。我的模仿 $此->事件->一批 看起来像这样:

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

    然而,这会导致问题- increment() 是受保护的方法 Model 因此不能被嘲笑。以下是确切的错误:

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

    它似乎是使用 __call() PHP神奇的方法,那么我该如何模拟它呢?我尝试创建 __调用() 模拟,但这会产生大量与 增量() 方法未实现。

    1 回复  |  直到 10 年前
        1
  •  0
  •   edcs    9 年前

    问题在于,如前所述, increment() 是受保护的方法 Illuminate\Database\Eloquent\Model() 。解决这个问题的方法是模仿 __call() 方法,如下所示:

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

    (不过,我不知道为什么我第一次尝试时没有成功)