在 Laravel 中创建可测试的外观

在 laravel 中创建可测试的外观

这里有一个备忘单,介绍如何通过添加依赖项注入、外观以及轻松交换伪造的方法来使简单的服务类更有用。

骨架很简单:

原来的服务等级创建服务类遵守的契约在服务提供者中,在容器中注册服务类创建立面创建一个可以交换用于测试的虚假合约实现

原来的服务等级

这是我们最初的服务类(很抱歉没有一个令人信服的例子,但实际上没有必要为此设计一个)。

<?phpnamespace appfoo;class fooservice{    public function foo(): string    {        return 'bar';    }    public function fizz(): string    {        return 'buzz';    }}

合同

首先,我们应该创建一份合同,这样我们就可以确保我们最终的假货和我们原来的服务都符合预期。以及任何未来的实施。

<?phpnamespace appfoocontracts;interface foo{    public function foo(): string;    public function fizz(): string;}

不要忘记确保服务实现它。

<?phpnamespace app;use appfoocontractsfoo;class fooservice implements foo{   // ...}

绑定到容器

接下来,我们应该将具体的实现绑定到我们服务提供商中的合约。

app->bind(foo::class, fooservice::class);    }   // ...}

门面

现在,我们可以创建我们的外观类。

<?phpnamespace appfoofacades;use illuminatesupportfacadesfacade;/*** @method static string foo(): string* @method static string fizz(): string*/class foo extends facade{    protected static function getfacadeaccessor(): string    {        return appfoocontractsfoo::class;    }}

外观只需要从容器中提取的绑定名称,并从 getfacadeaccessor 返回。在我们的例子中,这是当前绑定了我们的服务的合约的名称。

请注意,如果您想要 ide 支持,则必须在类上方的文档块中重新定义方法签名。

此时,我们可以使用我们的外观。

用法

json([            'foo' => foo::foo(),        ]);    }}

或者,我们也可以将其作为依赖项注入。

json([            'foo' => $this->foo->foo(),        ]);    }}

伪造门面

laravel 通常提供一种巧妙的方法来轻松伪造其外观,例如事件::假()。我们可以自己实现。

我们所要做的就是创建合约的假实现,然后将假方法添加到我们的外观中。

<?phpnamespace appfoo;use appfoocontractsfoo;class fakefooservice implements foo{    public function __construct(public foo $actual) {}    public function foo(): string    {        return 'fake';    }    public function fizz(): string    {        return 'very fake';    }}

在我们的假实现中,我们还创建了对“实际”具体类的公共引用。

这是我们的门面假实现。您可以看到我们利用了实际的参考。

actual            : static::getfacaderoot();        tap(new fakefooservice($actual), function ($fake) {            static::swap($fake);        });    }   // ...}

基本测试

现在让我们编写一个快速测试来访问我们上面创建的控制器示例。

get('/');        $response->assertjson(fn (assertablejson $json)            => $json->where('foo', 'bar'));    }    public function test_fake_foo(): void    {        foo::fake();        $response = $this->get('/');        $response->assertjson(fn (assertablejson $json)            => $json->where('foo', 'fake'));    }}

这些测试没有用,但它们表明使用我们的假货是多么容易。在 test_fake_foo 中,我们得到 foo=fake,而 test_foo 返回 foo=bar。

进一步测试

fakes 的有趣之处在于,在我们的 fakes 实现中,我们可以添加额外的方法来测试任何我们可能认为有用的东西。例如,我们可以在 fake 的 foo 方法中设置一个计数器,每次调用 foo 时该计数器都会递增。然后我们可以添加一个名为assertfoocount的方法,我们可以在其中断言该方法被调用的次数与我们预期的一样多。

foocount++;        return 'fake';    }    public function fizz(): string    {        return 'very fake';    }    public function assertfoocount(int $count)    {        assert::assertsame($this->foocount, $count);    }}

如你所见,我们使用 laravel 的 illuminatetestingassert 来进行断言。那么我们的测试就可以是这样的。

public function test_incrementor(): void{    Foo::fake();    Foo::foo();    Foo::foo();    Foo::foo();    Foo::assertFooCount(3); // pass!}

就是这样!

并不是所有东西都需要外观,但是当您构建内部使用的工具/包时,外观通常是一个值得依赖的强大模式。

这是包含所有代码的存储库:https://github.com/clintwinter/laravel-facade-example

以上就是在 Laravel 中创建可测试的外观的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 19:34:14
下一篇 2025年12月8日 16:22:40

相关推荐

  • PHP函数在云计算中的实用性

    PHP 函数在云计算中的实用性 云计算是一种通过互联网按需提供计算资源的服务,它提供了弹性和可伸缩的基础设施,使企业能够快速、轻松地部署和管理应用程序。PHP 是一种广泛用于 Web 发展的脚本语言,它提供了一系列函数,使其成为云计算中非常有用的工具。 PHP 函数在云计算中的用例 文件处理: 使用…

    2025年12月9日
    000
  • 如何使用 Apache、MySQL、PHP 和虚拟主机创建强大的 Ubuntu Web 服务器

    使用完整的 ubuntu 设置指南轻松部署和管理您的 web 开发环境 web 服务器的重要性 网络服务器是任何网站的支柱,作为向全球用户提供内容的平台。网络服务器的效率和可靠性对于您在线业务的成功至关重要。 ubuntu、apache、mysql、php 和虚拟主机概述 立即学习“PHP免费学习笔…

    2025年12月9日
    000
  • 使用 PHP 安全地传送电子邮件:使用 SMTP 发送无垃圾邮件的指南

    这是如何使用 php smtp 发送电子邮件而不进入垃圾邮件文件夹的分步示例。 我们将使用 phpmailer 库,它简化了通过 smtp 发送电子邮件的过程,并有助于提高送达率。按照以下步骤,您将了解如何正确配置 smtp 以避免电子邮件进入垃圾邮件文件夹。 第1步:安装phpmailer 首先,…

    2025年12月9日
    000
  • 在 Laravel 的 env 文件中将一个变量引用到另一个变量

    在 laravel 项目中,配置设置通常在 .env 文件中定义。很多时候,您可能希望将一个变量引用到该文件中的另一个变量。在这种情况下,laravel 允许您使用 ${} 字符串模式。这样,您就可以在另一个变量中调用之前定义的变量。 怎么做? 您可以使用以下方法将 .env 文件中的一个变量引用到…

    2025年12月9日
    000
  • PHP 升级:使用 PHPStan 阻止回归

    照片由 ron mcclenny 在 unsplash 上拍摄 通常,当人们想到 phpstan 时,他们通常会想到改进类型覆盖率。这实际上只是 phpstan 能力的一小部分。在本文中,我们将学习如何使用它来停止升级回归。 什么是升级回归? 升级回归是指您希望删除应用程序中的某些功能。这可能是您的…

    2025年12月9日
    000
  • 小 Swoole Symfony Http 客户端 0

    Small Swoole Symfony Http Client 的第一个版本来了。 这是一个基于 swoole 的 Symfony HTTP 客户端实现,符合 Symfony HttpClientInterface,用于高性能异步 HTTP 请求。 Swoole 和 OpenSwoole 兼容性重…

    2025年12月9日
    000
  • Laravel:构建电子学习脚本的强大框架

    Laravel 是一种流行的 PHP 框架,由于其优雅的语法、强大的功能和对开发人员友好的生态系统,在开发社区中获得了巨大的关注。在构建电子学习脚本时,Laravel 提供了一系列引人注目的优势,使其成为一个强大的选择。 1。 MVC架构:Laravel 遵循模型-视图-控制器 (MVC) 架构模式…

    2025年12月9日
    000
  • php函数与前端交互时的难题及解决方案

    在 php 函数与前端交互时,常见的难题及解决方案如下:在前端访问 php 变量:输出到 html 中,例如 echo 从前端传递数据:通过 html 表单或 ajax 请求提交数据。处理客户端事件:使用 javascript 监听事件并通过 ajax 发送数据。跨域请求:配置 cors 允许不同域…

    2025年12月9日
    000
  • php函数在不同框架中的兼容性分析

    PHP 函数在不同框架中的兼容性分析 在 PHP 开发中,选择合适的框架可以极大地提高效率和可维护性。然而,不同的框架可能对 PHP 函数具有不同的兼容性。本文将分析一些常用 PHP 函数在主流框架中的兼容性,并提供实战案例。 主流 PHP 框架 LaravelSymfonyCodeIgniterZ…

    2025年12月9日
    000
  • php函数与第三方库集成策略

    php 与第三方库集成策略有三个:1. 使用 composer;2. 手动下载并包含;3. 使用 composer 的自动加载。选择最合适的策略取决于库大小、项目需求和个人偏好。遵循这些实践,可以轻松集成第三方库,提高 php 项目的开发效率和代码质量。 PHP 函数与第三方库集成策略 在 PHP …

    2025年12月9日
    000
  • PHP 函数单元测试中的异步测试

    PHP 函数单元测试中的异步测试 什么是异步测试? 在异步测试中,测试函数不会立即返回结果,而是通过一个回调函数或 Promise 对象表示未来的结果。 PHPUnit 通常用于同步测试,但在某些情况下异步测试也是必要的。 如何使用 PHPUnit 进行异步测试? 立即学习“PHP免费学习笔记(深入…

    2025年12月9日
    000
  • php函数最佳实践和设计模式

    php 函数最佳实践和设计模式最佳实践:遵循 psr-12 命名规则使用参数类型提示指定返回值类型使用默认值记录异常设计模式:单例模式:确保只有一个类实例观察者模式:允许对象订阅其他对象的状态变更 PHP 函数最佳实践和设计模式 编写可维护、可扩展且高效的 PHP 函数至关重要。遵循最佳实践并应用设…

    2025年12月9日
    000
  • PHP 函数单元测试中的版本控制

    PHP 函数单元测试中的版本控制 在 PHP 项目中进行单元测试时,保持代码库和测试的同步至关重要。本文介绍了使用版本控制系统(如 Git)管理 PHP 函数单元测试的方法,包括如何追踪测试代码更改、管理不同版本的测试以及与主代码保持一致。 追踪测试代码更改 在将单元测试添加到代码库之前,请初始化一…

    2025年12月9日
    000
  • PHP 函数与 C 扩展交互的跨平台兼容性

    php 扩展与 c 扩展交互时跨平台兼容性存在问题,包括头文件包含、数据类型和 api 调用差异。解决这些问题的方法有:使用条件编译根据平台定义代码;创建平台抽象层来隐藏系统差异;配置扩展加载以根据平台进行调整;使用跨平台库来处理特定平台相关的任务。 PHP 函数与 C 扩展交互的跨平台兼容性 PH…

    2025年12月9日
    000
  • 如何在 Laravel 中运行 Cron 作业

    在本教程中,我将向您展示如何在 laravel 中运行 cron 作业,但最重要的是,我们会让事情对我们的学生来说简单易行。在构建 laravel 应用程序时,我们将探索如何在您自己的计算机上设置和运行这些自动化任务。 首先,什么是 cron 作业?将其视为您网站的私人助理 – 一个从不…

    2025年12月9日
    000
  • Laravel 入门:查询生成器初学者指南

    laravel 的 查询生成器 提供了一个强大、流畅的界面,用于在 php 中构建 sql 查询。它允许您以富有表现力的、类似 sql 的语法与数据库交互,同时抽象出大部分复杂性。 我们将演练 laravel 应用程序中的典型用例,使用查询生成器执行各种任务,例如选择、插入、更新和删除数据。 第 1…

    2025年12月9日
    000
  • PHP函数中异常处理如何与框架和库进行集成?

    php 中的异常处理可通过集成框架和库来实现,框架(如 laravel)提供内置机制,库(如 guzzlehttp)允许注册自定义处理程序。集成示例包括:laravel 中,使用 appexceptionshandler 类定义自定义错误处理程序。guzzlehttp 中,使用 guzzlehttp…

    2025年12月9日
    000
  • PHP 函数单元测试的数据准备策略

    在 php 函数单元测试中,数据准备至关重要。可采用以下策略:创建测试双工(如模拟对象)来隔离并控制外部依赖关系。使用数据工厂生成一致可靠的数据对象。在不需要复杂数据准备的情况下,在测试中直接设置固定值。 PHP 函数单元测试的数据准备策略 在 PHP 中进行函数单元测试时,数据准备是至关重要的。本…

    2025年12月9日
    000
  • 使用 DTO 简化 Laravel 中的数据传输

    以下是有关如何使用 laravel data 创建数据传输对象 (dto) 的分步示例: 1. 安装 laravel 数据包 首先,使用 composer 安装 spatie/laravel-data 包。该软件包有助于创建 dto 并有效管理数据。 composer require spatie/…

    2025年12月9日
    000
  • PHP 函数单元测试中的常见错误及解决方案

    在编写 php 函数单元测试时,常见的错误包括:缺乏隔离环境、对私有方法进行测试以及未测试边缘情况。具体解决方案为:使用依赖项注入创建隔离环境;使用反射覆盖私有方法进行测试;仔细考虑所有可能输入输出并编写测试用例涵盖边缘情况。通过避免这些错误,可以编写可靠的函数单元测试,提升代码质量和稳定性。 PH…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信