首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在PHPUNIT中模拟API包装类的结果?

如何在PHPUNIT中模拟API包装类的结果?
EN

Stack Overflow用户
提问于 2020-08-03 11:45:03
回答 1查看 606关注 0票数 0

我正在使用日历包对进行api调用,我想编写一些特性测试,但是我想模拟事件包装类,这样我的测试就不会真正地进行API调用了

我用拉拉斯威尔斯的正面

控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CalendarEventController extends Controller
{
    public function show($calendarId, $event_id)
    {
        return response()->json(\Facades\Event::find($event_id, $calendarId));
    }
}

Event:find方法返回自身。大多数数据在googleEvent参数中。

事件类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Event
{
    /** @var \Google_Service_Calendar_Event */
    public $googleEvent;

}

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function test_event(){
    
        \Facades\Event::shouldReceive('find')->once()->andReturn(?);
        $response = $this->json('GET','/event/1/1');
        $response->assertJson([
        ...
        ]);
}

我希望这个被模仿的外观返回什么,以便以预期的格式返回响应。

我想我可以返回一个新的事件实例,但是事件类有很多依赖项,我需要这些依赖项来模拟。

如果返回Self,它将返回模拟对象,但googleEvent为null。

编辑

因为我从不设置google事件。所以一个可能的选择是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$mock = \Facades\Event::shouldReceive('find')->once()->andReturnSelf()->getMock();
$mock->googleEvent = {Whatever}

但是,这仍然留下了一个问题,我需要模拟5个类才能得到正确格式化的结果End Edit

我应该做些什么来模拟这个类,这样如果数据是一个正常的请求,我就可以以它会出现的格式返回数据?

结果格式如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  +googleEvent: Google_Service_Calendar_Event    
    +id: "XXX"
    +kind: "calendar#event"
    ...
    ...
    +"creator": Google_Service_Calendar_EventCreator 
    +"organizer": Google_Service_Calendar_EventOrganizer 
    +"start": Google_Service_Calendar_EventDateTime 
    +"end": Google_Service_Calendar_EventDateTime 
    +"reminders": Google_Service_Calendar_EventReminders

为了进行模拟,这需要模拟Google_Service_Calendar_Event,这需要其他5个GOOGLE_SERVICE_CALENDAR_*类,依此类推。

EN

回答 1

Stack Overflow用户

发布于 2020-08-05 09:58:11

利用@KurtFrais的建议,我想出了一个解决方案。

他建议将实现交换为基于环境的模拟对象。我没有更改ServiceProvider中的实现,而是更改了测试方法中的实现。

我创建了一个模拟对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class EventMock extends Event{

    public $googleEvent;

    public static function find($eventId, string $calendarId = null): Event
    {
        $self = new self();
        $self->googleEvent = $self->fake();
        return $self;
    }


    ...
    ...
}

然后在测试方法中,我将实现替换成如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function test_event()
{
    $this->instance(Event::class,new EventMock());


    $response = $this->json('GET','/event/1/1');
    $response->assertJson([
    ...
    ]);
}

因此,当Laravel获得事件类的新实例时,将使用EventMock对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63235997

复制
相关文章
如何在phpunit中mock(模拟)一个单例类
Mock简介 当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。Phpunit中提供了一套模拟类的api,简单使用如下:
跑马溜溜的球
2020/12/07
3.1K0
如何在phpunit中mock一个单例类
Mock简介 当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。 Phpunit中提供了一套模拟类的api,简单使用如下:
跑马溜溜的球
2020/12/07
1.8K0
java中的包装类
  通过查看源码或API文档,我们可以知道包装类再java.lang包下,而且所有包装类都是final修饰的,即不能被继承。里面维护的基本数据类型的变量value,也是final修饰的,不能更改,即一旦创建对象,其内容就不能修改。包装类主要分为三种不同类型:数值类型(Byte、Short、Integer、Long、Float和Double)、Character类型、Boolean类型。
别团等shy哥发育
2023/02/25
1K0
java中的包装类
【5min+】美化API,包装AspNetCore的返回结果
【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。
句幽
2020/05/19
1.3K0
【Java】常用API——Object、StringBuilder、包装类
java.lang.Object 类是 Java 语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使
陶然同学
2023/02/27
5990
【Java】常用API——Object、StringBuilder、包装类
【Java_11】Object 类、常用API、包装类
一、Object 类 1. Object 类介绍 * Object 类是所有类的父类,若一个类没有指定继承的类则继承Object。任一类都直接或间接继承于Object 2. Object 类的方法 ① toString() * 源码 public String toString() { return getClass().getName() + '@' + Integer.toHexString(hashCode()) } * 若不重
用户8250147
2021/02/04
5220
包装类
1.什么是包装类 把基本数据类型包装成一个对象,以面向对象的思想来使用这些类型 基本数据类型 对应的包装类 byte Byte short Short int Integer long Long float Float double Double Char Character boolean Boolean 用包装类比起基本类型它是以类创建对象的形式,所以它有更多的功能性有很多方法可用 2.装箱操作 装箱就是把基本数据类型转为包装类,以整型为例 int a = 5; Integer b = new
木瓜煲鸡脚
2019/07/22
4700
包装类
深入浅出 Java 中的包装类
前阵子,我们分享了《Java中的基本数据类型转换》这篇文章,对许多粉丝还是有带来帮助的,今天讲一下 Java 包装类的的由来,及自动装箱、拆箱的概念和原理。
Java技术栈
2019/07/12
7460
深入浅出 Java 中的包装类
Java 包装类
Java在设计之初的设计原则就是:“一切皆对象”,一切的操作都要求用对象的形式进行表述。
Mirror王宇阳
2020/11/10
5030
包装类应用
比较时会先在对象缓存区查找-128到127的值,有就会直接用,没有会通过new的方式去构造一个
Breeze.
2022/04/23
4550
包装类应用
Java 包装类
​  Java为每一个基本数据类型提供了对应的一个包装类。包装类是一个类,这样Java就可以在包装类中提供常用的方法等供我们使用。   java并不是纯面向对象的语言,java语言是一个面向对象的语言,但是java中的基本数据类型却不是面向对象的,但是我们在实际使用中经常将基本数据类型转换成对象,便于操作,比如,集合的操作中,这时,我们就需要将基本类型数据转化成对象!
愷龍
2022/09/26
5910
Java 包装类
Java包装类
分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。 DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。 BO( Business Object):业务对象。 由Service层输出的封装业务逻辑的对象。 AO( Application Object):应用对象。 在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。 VO( View Object):显示层对
用户10325771
2023/03/01
3890
Java —— 包装类(Wrapper类)
由于 Java 中的八种基本数据类型不面向对象,为了使用方便,为每个基本数据类型设计了一个对应的类,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),均位于 java.lang 包中。
用户7886150
2021/04/27
2.7K0
Java 中为什么设计了包装类
在 Java 中,万物皆对象,所有的操作都要求用对象的形式进行描述。但是 Java 中除了对象(引用类型)还有八大基本类型,它们不是对象。那么,为了把基本类型转换成对象,最简单的做法就是「将基本类型作为一个类的属性保存起来」,也就是把基本数据类型包装一下,这也就是包装类的由来。
飞天小牛肉
2021/03/18
1.3K0
Java 中为什么设计了包装类
Java 为什么需要包装类,如何使用包装类?
Java 是号称面向对象的语言,所有的类型都是引用类型。 Object 类是所有类的父类,而且是唯一不用指定明确继承的类。但是基本类型如 int 不是引用类型,也不是继承自 Object,所以 Java 需要一个这样的包装类来使其面向对象的完整性。 包装类同时也可以实现可空类型,即一个数值是空的。Java 集合中也只能放入包装类型,而不支持基本类型。
水货程序员
2018/11/13
6.6K0
java之包装类
装箱:基本数据类型转换成包装类的实例。int i = 5;Integer t = new Integer(i);
西西嘛呦
2020/08/26
4610
整型包装类值的比较
当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的 Integer 对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。
黑洞代码
2021/01/14
1.2K0
《JAVA SE》包装类
a) Object类可以接受所有的引用数据类型(数组、类、接口),为了让Object类可以接受Java中一切内容,引入包装类,把基本类型的数值封装到类的对象之中就产生了包装类。
VIBE
2022/12/02
4680
Java实用类(二)-包装类
​ Java中的基本类型功能简单,不具备对象的特性,为了使基本类型具备对象的特性,所以出现了包装类,就可以像操作对象一样操作基本类型数据;包装类不是为了取代基本数据类型,而是在数据类型需要使用对象表示的时候,才使用包装类;
化羽羽
2022/10/28
3740
JavaSE基础:包装类
包装类 1.为什么需要包装类? Java在设计之初有一个基本原则:一切皆对象,一切的操作都要求用对象的形式进行描述。但是这里面就会出现一个矛盾,基本数据类型不是对象。那么我们会如何修复这个BUG呢?最
企鹅号小编
2018/02/02
8790
JavaSE基础:包装类

相似问题

模拟PHPUnit中的类

12

phpunit中的模拟类

11

如何在phpunit中模拟git diff的结果?

13

PHPUnit:在“包装器”对象中模拟对象

11

PHPUnit模拟类常量

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文