有什么方法可以测试某个方法是否触发了我的对象?
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。不过,在没有看到实际代码的情况下,很难说清楚。
使用最新的 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。不过,在没有看到实际代码的情况下,很难说清楚。