完全意识到像Mockery这样的东西存在,我试图看看PHPUnit中的哪些测试就像使用直接PHP一样。只有匿名类的出现才能实现这一点。我的工作完美,除非我想在我的扩展类中覆盖的属性是私有的,那么它当然会失败。以下是测试结果的一个小例子:
$test = new class() extends ClassImExtending {
// user is protected in ClassImExtending, and its value is
// injected User
public $user;
public function __construct() {
// Overwrites ClassImExtending constructor so that I don't
// have to inject all the same dependencies for the purpose
// of my test
// By extending User, it forces any methods I'm overriding
// to accept the same number and type of arguments
$this->user = new class() extends User {
public function getUser() {
$user = new User;
$user->id = 1;
return $user;
}
};
}
}
基本上,只要ClassImExtending中的属性$ user受到保护或公开,并且我正在测试的方法除了$ user之外不使用任何其他ClassImExtending属性,那么以下内容将很有用:
$result = $test->methodImTestingInClassImExtending();
但就像我之前说过的,如果$ user是私有的,methodImTestingInClassImExtending()当然甚至都不会查看我的匿名类覆盖属性$ user,它会在ClassImExtending中查看$ user,这当然是value为null,因为我的匿名类重写了类构造函数,其中$ user被赋予ClassImExtending中的值。
我一直在尝试使用Closures或任何类似的尝试,看看我是否可以使这个设置以某种方式访问我正在扩展的类的私有属性,以便我可以覆盖该值。我认识到这会破坏私有财产的目的,而不是典型的用例。但是为了测试我在单元测试的概念中做了什么......有没有人有任何想法或想法?