在控制器中的自定义类上调用 0 次嘲弄模拟和间谍

Posted

技术标签:

【中文标题】在控制器中的自定义类上调用 0 次嘲弄模拟和间谍【英文标题】:Mockery mock and spy called 0 times on custom class in controller 【发布时间】:2020-08-12 01:52:29 【问题描述】:

当我测试 MyCustomClass 时,我在 Laravel 7 测试中的 spy 和 mock 遇到了困难。

我在运行 $this->get 之前尝试了 mock 和 $this->get 之后的 spy。两者都有相同的错误消息(* 下面)。

在控制器中运行调试时,$myCustomClass 仍然是 MyCustomClass 而不是模拟对象。

MyCustomClass

class MyCustomClass

 public function execute()
 
   return 'hello';
 

我的控制器

class MyController

 public function show()
 
   $myCustomClass = new MyCustomClass();

   $data = $myCustomClass->execute();

   return $data;
 


private $mySpy;

public function testAMethod()
    
        $spy = $this->spy(MyCustomClass::class); 

        $response = $this->get('/my/path');

        $spy->shouldHaveReceived('execute');

        $response->assertStatus(200);
    

错误

Method execute(<Any Arguments>) from Mockery_2_App_MyCustomClass should be called
 at least 1 times but called 0 times.

【问题讨论】:

【参考方案1】:

问题是您正在使用 new 关键字自己实例化 MyCustomClass

为了让 Laravel 能够用 spy 替换真实的类,你必须使用 service container。

类似这样的:

class MyController

    public function show(MyCustomClass $myCustomClass)
    
        return $myCustomClass->execute();
    

【讨论】:

以上是关于在控制器中的自定义类上调用 0 次嘲弄模拟和间谍的主要内容,如果未能解决你的问题,请参考以下文章

闭包内的嘲弄模拟方法

在 fit 方法采用 3 个参数的自定义类上使用 sklearn GridSearchCV

ios中Mkmapview中的自定义标注

UICollectionView 中的自定义布局

Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题

嘲弄:被动部分模拟与默认模拟有何不同?