PHP:我应该嘲笑还是应该走?

php:我应该嘲笑还是应该走?

简而言之模拟

模拟旨在测试真实对象的行为

它们模拟依赖关系,因此您不必调用可能显着减慢单元测试速度的外部资源。

您可以定义期望并验证它们。

例如,您可以确保某个方法被调用特定次数和/或使用某些参数:

use phpunitframeworktestcase;class mytest extends testcase{    public function testmockexample(): void    {        $depencencymock = $this->createmock(mydependency::class);        $dependencymock->expects($this->exactly(2))              ->method('somemethod')              ->with('some parameter');        $classtotest = new classtotest($dependencymock);   }}

返回值

willreturn() 确保与返回类型的兼容性:

// in codeclass myclass {    public function getnum(): int {    }}// in tests$myclassmock = $this->createmock(myclass::class);$myclassmock->expects($this->once())            ->method('getnum')            ->willreturn(2);

如果您想根据输入参数测试动态行为,也可以使用 willreturncallback。

立即学习“PHP免费学习笔记(深入)”;

应避免的不良做法

由于模拟仅模仿真实行为,因此很容易错过要点。让我们讨论一下常见的不良做法:

无期望返回值

❌不要这样做:

$colorservicemock = $this->createmock(colorservice::class);$colorservicemock->method('hextoname')     ->willreturn('red');$color = (new myclass($colorservicemock))->getcolorname('ff0000');

✅ 相反,添加一些期望:

$colorservicemock->expects($this->once())     ->method('hextoname')     ->with('00f00')     ->willreturn('green');$color = (new myclass($colorservicemock))->getcolorname('00f00');

记住模拟的目的是验证交互。

模拟真实对象而不是接口

让我们测试一下实现 someinterface 的 myclass。

❌不要这样做:

$myclassmock = $this->createmock(myclass::class);

✅ 相反,模拟界面:

$myclassmock = $this->createmock(someinterface::class);

模拟关注行为。接口通常不会改变,因为您应该修改实现,而不是契约。

过度模拟测试

tomas votruba 精美地解释了这个问题:从过度模拟测试中提取价值的 5 种方法

使用模拟来掩盖不良的设计实践

很容易忽略组件之间的紧密耦合:

$productrepositorymock = $this->createmock(productrepository::class);$invoicerepositorymock = $this->createmock(invoicerepository::class);$emailservicemock = $this->createmock(emailservice::class);$overcomplexservice = new overcomplexservice($productrepositorymock, $invoicerepositorymock, $emailservicemock);

上面的示例打破了关注点分离,而模拟则延续了这种不良做法。

完全依赖模拟

模拟是强大的工具,但单元测试还不够。您需要各种其他类型的测试(例如集成、e2e)。

如何发现模拟的错误使用

除了不良做法之外,还有其他迹象可能表明项目中误用或过度使用了模拟:

测试不反映真实场景,忽略了生产中的关键问题测试和实现之间存在紧密的联系,导致相关模拟的频繁更新测试过于复杂,使得它们更难阅读和维护

模拟和存根

martin fowler 写了一篇精彩的文章,解释了为什么 mock 不是 stub。

让我们看看您可能会使用它们的具体情况:

何时使用模拟

这里有一些测试用例,其中模拟更有意义:

您需要测试您的类如何与其依赖项交互您需要检查复杂的序列,其中使用不同的参数多次调用特定方法

何时使用存根

您可以非常方便地使用 phpunit 创建存根:

$myDependencyStub = $this->createStub(MyDependency::class);

以下是一些测试用例,其中存根更有意义:

您想要测试代码的输出或状态,而不需要验证交互您需要测试一些计算,而不需要与实际数据库交互

简而言之,存根并不是为了检查真实对象的行为,而是状态

微调

单元测试的主要目的是确保每个单元/组件按预期工作,但除了实际代码之外,您还必须维护这些测试。

存根可以简化测试设置,对于不需要跟踪方法调用和交互的简单场景非常有效。

它可以通过集中某些测试来防止不必要的复杂性。

包起来

mock 可以跟踪方法调用及其参数。

不要忘记返回代表真实行为的值。否则,你可能会产生一种错误的安全感。

应谨慎使用模拟,以避免不必要的维护复杂性。

以上就是PHP:我应该嘲笑还是应该走?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1283766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 00:09:03
下一篇 2025年12月11日 00:09:16

相关推荐

  • Web3基金融资,资本持续涌入

    web3基金融资的浪潮持续高涨,宛如一股不可阻挡的洪流,正以前所未有的速度涌入区块链和去中心化应用领域。这股资本的注入不仅仅是简单的财务投资,它更是对未来数字经济形态的深刻洞察与战略布局。从基础设施到应用层,从defi到nft,再到元宇宙,每一个web3的细分赛道都吸引着顶尖风投机构、家族办公室乃至…

    好文分享 2025年12月11日
    000
  • AI与区块链融合:未来科技发展趋势

    在数字经济浪潮中,人工智能(ai)与区块链技术的深度融合,正成为一股不可逆转的洪流,塑造着未来科技发展的全新格局。这种融合不仅是技术层面的简单叠加,更是理念与实践的交织,有望解决当前数字世界面临的诸多挑战,例如数据信任、隐私保护、效率提升等。想象一下,一个由智能合约驱动的供应链,每个环节的数据都由a…

    好文分享 2025年12月11日
    000
  • 加密货币实时行情软件APP 最好的加密货币行情分析APP推荐Top10

    Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安装包下载: 想实时掌握币圈动态,选对行情APP是关键。市面上工具众多,功能侧重各不相同,从纯数据追踪到集成交易,适合不同需求的用户。下面推荐几款2025年广受认可的加密…

    2025年12月11日
    000
  • 十大加密货币看盘软件哪个最好用?2025加密货币看盘软件推荐汇总

    Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安装包下载: 选看盘软件,核心是看需求。如果你主要做交易,直接用大交易所的APP最方便,数据和下单一体化;如果想全面了解市场动态、跟踪新项目或做深度分析,专业的行情数据平…

    2025年12月11日
    000
  • Tether稳定币:市场份额与合规性

    tether(usdt),作为加密货币市场中举足轻重的美元稳定币,其市场份额的巨大体量和围绕其合规性的持续讨论,一直是行业内外关注的焦点。这种与美元一比一锚定的数字资产,旨在为波动剧烈的加密货币市场提供一个相对稳定的价值储存和交易媒介。它的出现,极大地便利了加密资产的交易、套利以及跨境支付,成为加密…

    好文分享 2025年12月11日
    000
  • 链上数据分析:巨鲸动向与市场情绪

    在波澜壮阔的加密货币市场中,链上数据分析犹如一盏明灯,指引投资者穿越迷雾,洞察市场深层逻辑。特别是巨鲸动向,它们凭借其庞大的资金体量,往往能引发市场剧烈波动,其一举一动都牵动着无数散户的心弦。理解巨鲸的交易行为模式,识别它们是正在吸筹、派发,还是仅仅进行资金转移,对于预测市场趋势,制定有效的投资策略…

    好文分享 2025年12月11日
    000
  • eth余额不足怎样处理 如何查询交易所eth余额教程

    在进行以太坊网络操作时,遇到“ETH余额不足”的提示是一个常见问题,这通常与网络手续费(Gas Fee)有关。本文旨在清晰地解释此问题的原因,提供实用的解决方案,并附上在交易平台查询ETH余额的详细教程,帮助您顺畅地完成链上操作。 eth以太坊币全球主流交易平台推荐 1、欧易okx 官网入口: AP…

    2025年12月11日
    000
  • FLock.io(FLOCK)币是什么?怎么样?FLOCK架构、代币和路线图介绍

    目录 项目概述:FLock 做什么技术架构:联邦学习+零知识+多网络计算联邦学习与隐私训练和验证节点结算和链边选择代币经济学:供应、分配和效用总供应量和分配$FLock 核心实用程序生态系统伙伴关系、进展和数据端信号生态系统协同作用数据侧信号常问问题关键要点 flock 旨在构建一个去中心化的、保护…

    2025年12月11日
    000
  • DeFi总锁仓量创新高:万亿市场指日可待

    defi总锁仓量(tvl)的含义与计算 DeFi总锁仓量(TVL)是指所有存入去中心化金融协议中的数字资产总价值。它是一个衡量DeFi市场规模和活跃度的关键指标。TVL的增长直接反映了用户对DeFi生态系统的信任和参与程度。 TVL的计算方式相对直接,但理解其构成有助于更深入地理解DeFi市场的动态…

    好文分享 2025年12月11日
    000
  • 加密货币行情分析用什么好?2025币圈行情软件排行Top10

    Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安装包下载: 想知道现在看币圈行情用哪个软件最好?2025年选择确实多,但核心就两点:数据要准、更新要快。别再随便找个APP就用了,下面这几个是经过大量用户验证、功能全面…

    2025年12月11日
    000
  • 比特币巨鲸抛售11.5万枚BTC,创2022年中期以来最大抛售潮

    目录 巨鲸余额变化放缓结构性对冲长期表现更为健康‍ 比特币巨鲸上个月出售了约127亿美元的比特币,给价格带来压力,并“表明大型投资者中存在强烈的风险规避情绪。” 分析师指出,比特币巨鲸在过去一个月内累计抛售了高达127亿美元的比特币(BTC),持续的抛售有可能在接下来的几周继续对价格构成压力。 Cr…

    2025年12月11日
    000
  • 隐私计算代币:数据安全与价值流转

    随着数字化浪潮的汹涌向前,数据已成为驱动现代社会发展的核心引擎。然而,数据的巨大价值也伴随着日益严峻的挑战——如何在利用数据价值的同时,确保其隐私与安全?这正是隐私计算代币所要解决的核心问题。这些代币不仅仅是数字资产,它们更是隐私计算技术在区块链上应用的具象化体现,旨在通过加密、零知识证明、联邦学习…

    好文分享 2025年12月11日
    000
  • 比特币突破10万美元:牛市行情再燃

    比特币突破10万美元是多重因素推动的历史性里程碑,包括机构资金涌入、通胀担忧、现货ETF获批、减半效应、技术创新及地缘政治不确定性;投资者应通过多元化配置、风险管理、长持与波段结合策略参与牛市,选择安全、高流动性、合规的交易所如Binance、OKX、火币进行交易,并警惕市场投机、回调、诈骗、监管与…

    2025年12月11日
    000
  • Hyperliquid稳定币竞标战打响,谁会成为USDH的发行人?一文介绍

    目录 @Paxos@Frax@fiege_max@withAUSD一些思考 随着 @HyperliquidX 宣布即将推出 USDH,各大竞争者已纷纷入场争夺发行权,甚至承诺将高达100%的储备收益和利息回馈给 Hyperliquid 社区。 简单回顾一下背景,方便不熟悉的朋友了解: 稳定币是 Hy…

    2025年12月11日
    000
  • 区块链游戏资产代币化:开启数字所有权时代

    区块链技术与游戏行业的深度融合,正在催生一场深刻的数字所有权革命。传统游戏世界里,玩家投入大量时间和金钱获取的道具、装备和角色,其所有权往往仅限于游戏公司内部数据库的一个记录,玩家并不真正拥有这些虚拟资产。一旦游戏服务器关闭,或者玩家违反了服务条款,这些资产就可能灰飞烟灭。然而,通过区块链技术对游戏…

    好文分享 2025年12月11日
    000
  • 一文详细了解永续合约的爆仓算法:山寨牛市的源动力

    2025年的加密牛市或许(早已)悄然降临,但其驱动力的节奏却与往昔截然不同。如果你仍把目光锁定在现货交易量上来判断市场温度,那你可能只瞥见了冰山露出水面的一角。这一轮行情真正的主角,是永续合约(Perps)——一个庞大、高杠杆、由多空双方激烈对撞构成的PVP战场。这里的流动性、叙事逻辑和财富效应,正…

    2025年12月11日
    000
  • 什么是不稳定币(USDUC)?值得购买吗?USDUC特点、运作方式及未来发展

    目录 摘要为什么您最近应该关注USDUC?USDUC概述什么是不稳定币 (USDUC)?USDUC的特点USDUC 如何运作?波动性优先模型全链部署代币流通USDUC 与稳定币及其他迷因币的比较关于 USDUC 的融资信息USDUC 的投资风险与回报USDUC 的未来潜力与采用趋势USDUC 值得购…

    2025年12月11日
    000
  • SatLayer(SLAY)币是什么?怎么买?SLAY币价格预测及未来展望

    目录 SLAY币最新新闻和价格动态SatLayer(SLAY)是什么?SatLayer 开发团队和融资SatLayer是如何运作的?SLAY币是什么?SLAY代币经济学SLAY币价格走势分析SatLayer(SLAY)未来展望SatLayer(SLAY)币价格预测SLAY币怎么买?常见问题FAQ总结…

    2025年12月11日 好文分享
    000
  • 巨鲸悄悄建仓 散户还在观望:一文了解山寨币即将爆发?

    目录 四年的周期节奏:这次为何姗姗来迟?山寨币市场的信号宏观因素为何压住市场?为何这轮周期感觉不同?起步更晚,舞台更大选择性山寨币季节全市场的压缩投资者行为演化为何感觉如此缓慢?导火索燃烧时的观察要点总结 一位朋友最近把当前的加密货币市场形容为“坏掉的唱片”——比特币和以太坊横盘整理,山寨币敲击阻力…

    2025年12月11日
    000
  • OpenLedger(OPEN)币价格预测:2025、2026、2027-2030年

    目录 什么是 OpenLedger?OpenLedger 的主要特点为什么 OpenLedger 很重要OpenLedger 可支付 AIOpenLedger 可支付 AI 基础设施可支付 AI 模型数据网络 (Datanet) 层区块链层OpenLedger 如何实现模型可支付OpenLedger…

    2025年12月11日 好文分享
    000

发表回复

登录后才能评论
关注微信