PHPUnit - 模拟特征
PHPUnit - Mocking a trait
我有一个特性被多个 类 使用,即
class SomeClass
{
use TimeoutTrait;
function handle() {
$this->traitFunction() // can this be mocked?
}
}
PHP 单元能够模拟 traitFunction()?.
在此先感谢您的帮助。
你好
最简单的方法是模拟父级 class,然后对该特征进行单元测试。或者您可以创建一个特定的 class 来实现特性,仅用于单元测试,但前提是您的特性不会做任何与父级交互的事情,反之亦然。
当您使用 PHPUnit 模拟 class 时,它会扩展 class 并覆盖您正在模拟的替换方法。所以在你的情况下,它看起来像这样:
$sut = $this->getMockBuilder('SomeClass')
->setMethods(['traitFunction'])
->getMock();
$sut->expects($this->once())
->method('traitFunction');
$sut->handle();
虽然这样做不是一个好主意,IMO。您正在指定 class 应该如何做某事,而不是它应该做什么。如果你的特征提供的方法足够复杂以保证它自己 class 你觉得你需要模拟它。使其成为独立的 class 并使用 strategy pattern 传递行为。
您的 class 想要这样:
Class SomeClass {
private $handler;
public function __construct(ClassFormerlyATrait $handler) {
$this->handler = $handler;
}
public function handler() {
$this->handler->traitFunction();
}
}
Class ClassFormerlyATrait {
public function traitFunction() {
// Does whatever the trait did.
}
}
这会使您的设计稍微复杂一些,但您现在可以使 class 适应变化。例如,您需要 traitFunction
在某些情况下做一些稍微不同的事情。您可以使用新功能扩展 ClassFormerlyATrait 并将其传递给 SomeClass 而不必担心破坏任何现有功能。
Traits 是 代码容器 编译器 "copy-pasted" 将代码 class 编译成 class 你想在其中使用它,从而使它可以在整个过程中重用世界。
一般来说,单元测试中的特征函数没有什么特别的,因为。当 class 被实例化时 trait 函数与可以复制粘贴的函数没有任何区别 它们写在 class.[= 的 trait 中10=]
因此,请毫不犹豫地 mock 您的特征函数,就像在 class.
中定义的任何其他常规函数 一样
我有一个特性被多个 类 使用,即
class SomeClass
{
use TimeoutTrait;
function handle() {
$this->traitFunction() // can this be mocked?
}
}
PHP 单元能够模拟 traitFunction()?.
在此先感谢您的帮助。
你好
最简单的方法是模拟父级 class,然后对该特征进行单元测试。或者您可以创建一个特定的 class 来实现特性,仅用于单元测试,但前提是您的特性不会做任何与父级交互的事情,反之亦然。
当您使用 PHPUnit 模拟 class 时,它会扩展 class 并覆盖您正在模拟的替换方法。所以在你的情况下,它看起来像这样:
$sut = $this->getMockBuilder('SomeClass')
->setMethods(['traitFunction'])
->getMock();
$sut->expects($this->once())
->method('traitFunction');
$sut->handle();
虽然这样做不是一个好主意,IMO。您正在指定 class 应该如何做某事,而不是它应该做什么。如果你的特征提供的方法足够复杂以保证它自己 class 你觉得你需要模拟它。使其成为独立的 class 并使用 strategy pattern 传递行为。
您的 class 想要这样:
Class SomeClass {
private $handler;
public function __construct(ClassFormerlyATrait $handler) {
$this->handler = $handler;
}
public function handler() {
$this->handler->traitFunction();
}
}
Class ClassFormerlyATrait {
public function traitFunction() {
// Does whatever the trait did.
}
}
这会使您的设计稍微复杂一些,但您现在可以使 class 适应变化。例如,您需要 traitFunction
在某些情况下做一些稍微不同的事情。您可以使用新功能扩展 ClassFormerlyATrait 并将其传递给 SomeClass 而不必担心破坏任何现有功能。
Traits 是 代码容器 编译器 "copy-pasted" 将代码 class 编译成 class 你想在其中使用它,从而使它可以在整个过程中重用世界。
一般来说,单元测试中的特征函数没有什么特别的,因为。当 class 被实例化时 trait 函数与可以复制粘贴的函数没有任何区别 它们写在 class.[= 的 trait 中10=]
因此,请毫不犹豫地 mock 您的特征函数,就像在 class.
中定义的任何其他常规函数 一样