我一直在阅读关于无模拟测试的文章,总的来说,我喜欢它.然而,当包含一些第三方类时,我一直在为该怎么做而苦苦挣扎.例如,如果我们有这样的类:

<?php

use External\ThirdPartyService;
use External\ThirdPartyException;

class AdapterForExternalService implements OurInterface
{
    private ThirdPartyService $external;

    public function __construct(ThirdPartyService $external)
    {
        $this->external = $external;
    }

    public function something(): int
    {
        try {
            return $this->external->someMethod();
        } catch (ThirdPartyException $e) {
            return 1;
        }
    }
}

我知道如何通过嘲笑外部类来测试它,但有可能不嘲笑它吗?

如果嘲弄在这里是不可避免的,那么如果ThirdPartyService类是最终的呢?

推荐答案

something()方法不会改变可观测状态.它只包装对第三方服务的调用,并将异常转换为一个整型返回值.可以观察到并且(理论上)可以断言的是对服务的调用和返回的结果.这意味着,如果您不是在嘲弄,您将不得不调用该服务.

要测试这一点,您必须模拟依赖关系.如果那个类真的是最终的,您可以为它创建一个非最终的外观并模拟它.

Php相关问答推荐

邮箱打开跟踪器不工作时发送邮件使用laravel调度程序

在Laravel中,如果我用session—put()存储一些信息,客户端浏览器是否可以使用这些信息?>

PHP中的圆生成器在国际日期变更线上失败

Laravel eloquent-如果没有包含InitialValue的结果,则查询where Second Value

根据产品类型显示或隐藏WooCommerce管理产品自定义字段

Laravel:测试命令时无法获取工作通知::AssertSentTo

通过访问单个产品页面更新WooCommerce产品元数据

如何从WooCommerce checkout 帐单邮箱字段中删除星号?

如何将LARAVEL模块路径和项目路径合并,因为当我使用模块路径时,它们会覆盖项目路径

无法在Laravel中将日志(log)通道设置为空

在WooCommerce Admin产品列表自定义列中显示来自元数据的统计数据

将 PHP 版本更改为 8.1,但 WordPress 认为我们正在使用版本 7.4?

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

安装 Herd 并返回 Valet 后为 502

WooCommerce 订单和邮箱通知的自定义产品描述

如何设置Mailersend PHP API 模板变量?

php/html OnSubmit 禁用输入类型提交未给出预期结果

Php 的新WeakMap - 枚举曾经被垃圾收集过吗?

将参数传递给 laravel 9 工厂

如何将 2021-04-08T22:25:09.335541Z 作为时间戳保存到 Laravel 中的数据库中?