【发布时间】:2012-10-16 01:57:22
【问题描述】:
是否可以在 PHPUnit mock builder 中构建这样的对象(实现接口并同时使用 trait)?
<?php
class FooClassThatD implements BarInterface
{
use BazTrait;
}
【问题讨论】:
-
你读过sebastian-bergmann.de/archives/906-Testing-Traits.html下面的内容吗? “PHPUnit 3.6 [...] 支持通过新的
getObjectForTrait()方法测试特征。此方法重用模拟对象代码生成器并返回使用被测特征的类的对象。” - 那是在 2011 年 1 月。那么你尝试了什么,因为它让我假设答案是是的,我想知道是否已经是这样了。 -
我想完成任何可以让这个测试通过的东西:
$foo = $this->getMockForTrait('BazTrait')->...; $this->assertInstanceOf('BarInterface', $foo); -
你不需要测试,PHP 本身在编译时会覆盖这个。你只是在这里寻找具体的类型,所以我想知道为什么甚至需要测试它。如果不是这种情况,请在运行时创建这样一个对象,我在这里概述了这一点:How to generate or modify a PHP class at runtime? - 然而,正如所写的那样,它非常没用,因为您按字面指定接口然后对其进行测试。 (已编辑,错误链接)
-
@hakre - 我怀疑 Mateusz 需要模拟来 a)使用 trait 和 b)同时实现接口,以便它可以用作期望已知接口的依赖项。我怀疑测试仅包含对接口的测试。
-
@DavidHarkness:我链接的问题包含这些组合的构建器,它完成所有这些但不创建模拟。看起来这可以与您的答案很好地结合起来,它只是在运行时生成代码并使用 eval 运行它(类似于 Mock lib)。您是否认为值得建议将其作为 Phpunit 的新功能(动态创建具有 trait+interface 的 Mock 对象)?