有什么方法可以测试某个方法是否触发了我的对象?

Any way to test that a method fires on my object?

使用最新的 PHPUnit,我一直在使用模拟来解决我的很多需求(例如模拟 GuzzleHttp\Client 来测试我的 api 调用方法)但是我已经 运行 变成我还没有弄清楚如何测试的东西。

class Foo {
    public function alpha($payload): void
    {
        // If some things are found in payload then...
        $this->beta();
    }

    public function beta(): void
    {
        // do some stuff behind the scenes
    }
}

鉴于上面的示例,我想测试当特定类型的有效负载传递到 Foo::alpha() 时,Foo::beta() 最终会被触发。如果 beta() 是其他某个对象的方法,那么我可以模拟该对象并允许它传递给 Foo 实例并告诉它期望 beta() 触发一次,等等,但我不确定如何当它不是同一个对象时,我可以测试这个触发器是否触发。

这可能与 PHPUnit 相关吗?

简短的回答是:您可以使用部分模拟

    public function test()
    {
        $foo = $this->createPartialMock(Foo::class, ['beta']);

        $foo->expects(self::once())
            ->method('beta');

        $foo->alpha(/* payload to trigger call to beta */);
    }

较长的答案是:您可能不应该使用部分模拟。大多数情况下,它表明设计存在问题。如果调用 beta 没有任何你能感觉到的效果,为什么还要验证它是否已被调用?我猜你的代码有一些原因。也许您的 class 具有隐式依赖关系,或者它具有多项职责,应拆分为单独的 classes。不过,在没有看到实际代码的情况下,很难说清楚。