ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

test-guard - phpunit

test-guard - phpunit Test Guard — PHP / PHPUnit / Pest 模式九条规则在 PHP 项目中的具体应用包括 WordPress 和 WooCommerce。在审查或编写 PHP 测试时阅读此文件。规则 2PHP 中的 mock 边界有理由的 mock 目标HTTPGuzzle 处理器/中间件、WordPress 中的pre_http_request过滤器外部 SDK支付网关、邮件提供商、LLM API 客户端时钟注入时钟psr/clock而不是直接调用time()外部路径上的文件系统优先使用vfsStream或临时目录而不是 mock无理由的 mock用 Mockery/Prophecy 替身模拟项目自己的值对象、DTO 或实体——请构造真实实例规则 8仅为了隔离类而模拟内部服务——如果装配很痛苦修复构造函数不要伪造协作者被测类的部分 mock——你不再测试该类本身规则 3数据提供者/** * see Rule 3 — variants of one scenario belong in a data provider. */#[DataProvider(provideSlugCases)]publicfunctiontest_slugify_normalizes_input(string$raw,string$expected):void{$this-assertSame($expected,slugify($raw));}publicstaticfunctionprovideSlugCases():array{returnarray(lowercasesarray(Hello World,hello-world),strips paddingarray( padded ,padded),transliteratesarray(Café Menu,cafe-menu),);}Pest 等价写法it(normalizes slug, ...)-with([...])。WordPress 特有的边界集成测试WP_UnitTestCase/wp-env/wp-cli scaffold使用带工厂的真实 WordPress 测试框架——self::factory()-post-create()、self::factory()-user-create()。不要 mockWP_Post或WP_User工厂的存在正是为了让你不必 mock规则 8。未加载 WordPress 的单元测试Brain Monkey / WP_Mock模拟get_option()或apply_filters()等 WordPress 函数是边界 mock有理由。但要断言你的代码用这些值做了什么而不是get_option被以特定参数调用规则 1。使用pre_http_request过滤器 mock 出站 HTTP而不是修补wp_remote_get内部。不要测试 WordPress 会净化、转义或钩子会触发——那是核心的保证规则 7。测试你的回调在给定输入时的行为。WooCommerce 说明在集成测试中通过WC_Helper_Product和WC_Helper_Order构建真实的WC_Product/WC_Order对象——绝不使用它们的MagicMock风格替身规则 8。购物车和结账逻辑是有状态的优先使用集成测试而非重度 mock 的单元测试mock 的购物车会隐藏钩子排序 bug。规则 9真实数据库WP_UnitTestCase已经将每个测试包裹在针对真实模式的事务中——将其用于查询、元数据和持久化逻辑而不是 mock$wpdb。Mock$wpdb-prepare或$wpdb-get_results来测试查询构建器什么都测不到。
返回列表