eboreum/phpunit-with-consecutive-alternative
Composer 安装命令:
composer require --dev eboreum/phpunit-with-consecutive-alternative
包简介
Do you miss the old "withConsecutive" method in PHPUnit? This library fixes that problem for you.
关键字:
README 文档
README

Do you miss the old "withConsecutive" method in PHPUnit? This library solves that problem for you.
Installation
Via Composer (https://packagist.org/packages/eboreum/phpunit-with-consecutive-alternative):
composer require --dev eboreum/phpunit-with-consecutive-alternative
Via GitLab:
git clone git@gitlab.com:eboreum/phpunit-with-consecutive-alternative.git
Using this library
Within a test method — i.e. a method inside a child of \PHPUnit\Framework\TestCase — simply do the following:
use Eboreum\PhpunitWithConsecutiveAlternative\MethodCallExpectation;
use Eboreum\PhpunitWithConsecutiveAlternative\WillHandleConsecutiveCalls;
...
$object = $this->createMock(DateTime::class);
$willHandleConsecutiveCalls = new WillHandleConsecutiveCalls();
$willHandleConsecutiveCalls->expectConsecutiveCalls(
$object,
'setISODate',
new MethodCallExpectation($object, 1999, 42),
new MethodCallExpectation($object, 2000, 43, 2),
);
...
$this->assertSame($object, $object->setISODate(1999, 42));
$this->assertSame($object, $object->setISODate(2000, 43, 2));
Make it easy for yourself
Make your own (abstract) test case class and simply add a proxy method doing the above.
Example:
use Eboreum\PhpunitWithConsecutiveAlternative\MethodCallExpectation;
use Eboreum\PhpunitWithConsecutiveAlternative\WillHandleConsecutiveCalls;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
abstract class AbstractUnitTestCase extends TestCase
{
/**
* @param non-empty-string $methodName
*/
final public static function expectConsecutiveCalls(
MockObject $object,
string $methodName,
MethodCallExpectation ...$methodCallExpectations,
): void {
(new WillHandleConsecutiveCalls())->expectConsecutiveCalls($object, $methodName, ...$methodCallExpectations);
}
}
⚠️ Notice: We do not hook into \PHPUnit\Framework\MockObject\Builder\InvocationMocker and so — contrary to the original withConsecutive — we place the above method on \PHPUnit\Framework\TestCase instead.
- In simpler terms: You call a method on
\PHPUnit\Framework\TestCase, with the mock as an argument, rather than calling a method on the mock itself. - This change is largely because PHPUnit utilizes the "final" keyword a lot on classes and does not support decorators, making extending (an instance of) InvocationMocker nigh-impossible (unless we do evil class-override things).
Why was "withConsecutive" removed?
You can see some of the reasoning and discussion about it here: https://github.com/sebastianbergmann/phpunit/issues/4026
The main reason @sebastianbergmann decided to remove withConsecutive (and at, by the way) was with the argument: Don't mock what you don't own. Sadly, the resource he links to in https://github.com/sebastianbergmann/phpunit/issues/4026 — being https://thephp.cc/news/2021/04/do-not-mock-what-you-do-not-own — is now a 404 page. Sebastian is a fantastic person and I and many others greatly appreciate his work over the years. Truly! However, I for one disagree with the "Don't mock what you don't own" sentiment. If something is part of the public API — third-part or not — one should be able to and allowed to mock it. Period.
No convenient alternative has been provided in PHPUnit itself.
A core problem — fixed
A core problem was the disjointed connection between arguments and their corresponding return values, as they would be provided in separate methods, i.e.:
withConsecutivewillReturnOnConsecutiveCallsorwillReturn
In order to make this connection abundantly clear, the value-object class \Eboreum\PhpunitWithConsecutiveAlternative\MethodCallExpectation has been implemented. Within it is stored a return value (required) and 0 or more arguments.
Notice: You may indeed use callbacks (i.e. \PHPUnit\Framework\TestCase->callback(...)) for the arguments instead of the actual values.
License & Disclaimer
See LICENSE file. Basically: Use this library at your own risk.
Contributing
We prefer that you create an issue and or a merge request at https://gitlab.com/eboreum/phpunit-with-consecutive-alternative, and have a discussion about a feature or bug here.
Branch rules
main = 2.x (not a tag): PHP ^8.5.
Previous branches:
1.x: PHP ^8.2.
Credits
Authors
- Kasper Søfren (kafoso)
E-mail: soefritz@gmail.com
Homepage: https://gitlab.com/kafoso
eboreum/phpunit-with-consecutive-alternative 适用场景与选型建议
eboreum/phpunit-with-consecutive-alternative 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.83k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2024 年 12 月 20 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「phpunit」 「dev」 「withconsecutive」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 eboreum/phpunit-with-consecutive-alternative 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 eboreum/phpunit-with-consecutive-alternative 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 eboreum/phpunit-with-consecutive-alternative 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
HiDev plugin for PHPUnit
Testing Suite For Lumen like Laravel does.
A cli tool which generates unit tests.
Monolog bridge for PHP Debugbar
Simple and fast methods to read private properties and call private methods
Analysis module for finding problematical shop data.
统计信息
- 总下载量: 2.83k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 2
- 点击次数: 7
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-12-20