同时模拟接口和特质

3

在PHPUnit的模拟构建器中,是否可以构建像这样的对象(即实现接口并同时使用trait)?

<?php

class FooClassThatD implements BarInterface
{
    use BazTrait;
}

2
你有没有在http://sebastian-bergmann.de/archives/906-Testing-Traits.html中读到以下内容?“PHPUnit 3.6[...]通过新的getObjectForTrait()方法支持测试特征。该方法重用模拟对象代码生成器并返回使用正在测试的特征的类的对象。”-那是在2011年1月。那么你尝试过什么,因为这让我觉得答案是“是”,我想知道是否已经完成了。 - hakre
我想实现任何能让这个测试通过的方法:`$foo = $this->getMockForTrait('BazTrait')->...; $this->assertInstanceOf('BarInterface', $foo);` - Mateusz Charytoniuk
1
@hakre - 我怀疑Mateusz需要模拟对象同时使用trait和实现接口,以便它可以作为依赖项使用,该依赖项期望已知的接口。我怀疑测试不仅仅是测试接口。 - David Harkness
@DavidHarkness:我链接的问题包含了这些组合的构建器,它可以完成所有这些操作,但不会创建模拟对象。看起来这可以很好地与你的答案结合起来,它只是在运行时生成代码并使用 eval 运行它(类似于 Mock 库)。你认为将其作为 PHPUnit 的新功能建议(动态创建带有 trait+interface 的 Mock 对象)是否值得? - hakre
如果MateuszCharytoniuk能够加入并用简单的话解释这个需要的原因,我相信如果情景值得,Sebastian为什么不想要呢?好的想法总是有起点的,让我们看看是否有真正的需求,以确保这不是任何膨胀。所以欢迎反馈,可能需要一些反驳我的早期质疑 :)。 - hakre
显示剩余3条评论
1个回答

4

我认为使用原生的模拟对象方法是不可能做到这一点的,因为它们使用特定的模板来模拟一个带有不允许任何扩展点的特质的类。您可以轻松地通过一个测试专用的类来绕过它,从而构建您的模拟对象。

abstract class BarWithBazTraitTestClass implements BarInterface
{
    use BazTrait;
}

按照与其他抽象类相同的方式为该类创建一个模拟。
$mock = $this->getMockForAbstractClass('BarWithBazTraitTestClass');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接