【问题标题】:Mock interface and trait simultaneously同时模拟接口和特征
【发布时间】: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-&gt;getMockForTrait('BazTrait')-&gt;...; $this-&gt;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 对象)?

标签: php phpunit


【解决方案1】:

我认为本地模拟对象方法不可能做到这一点,因为它们使用特定模板来模拟具有不允许任何扩展点的特征的类。您可以使用构建模拟的特定于测试的类轻松解决它。

abstract class BarWithBazTraitTestClass implements BarInterface
{
    use BazTrait;
}

为这个类创建一个模拟,就像为任何其他抽象类一样。

$mock = $this->getMockForAbstractClass('BarWithBazTraitTestClass');

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多