PHPUnit确保特性满足接口

时间:2017-07-09 22:24:04

标签: php testing interface phpunit traits

让我们看一下psr/log中的代码,特别是:

如您所知,特征无法实现接口,因此这两个部分需要一个类才能成功连接在一起。

让我们说我对这个特性的测试(通过PHPUnit' s getMockForTrait相对容易)。接下来要测试的是我想证明该特征满足接口

就代码而言,它看起来很简单:

public function testThatTraitSatisfiesInterface()
{
    $className = 'test_class_' . uniqid();
    $classCode = sprintf(
        'class %s implements %s { use %s; }',
        $className,
        LoggerAwareInterface::class,
        LoggerAwareTrait::class
    );

    eval($classCode); // ewww :see_no_evil:
    new $className(); // no errors? good, test successful
}

这里有一些问题:

  • 我希望尽可能避免eval()(即使我知道它是驱动PHPUnit的原因),但是......
  • 如果可能的话,我宁愿使用PHPUnit的功能

所以最大的问题是,还有其他选择吗?

1 个答案:

答案 0 :(得分:5)

如何将该类创建为测试资产:

{ "_id" : ObjectId("59629006d5idf90ed8013932"), "AssetNo" : "1", "location" : { "type" : "Point", "coordinates" : [ -79.33801, 35.31775 ] } }

然后断言它实现了接口:

namespace Foo\Bar\Test\Asset;

use Psr\Log;

final class LoggerAware implements Log\LoggerAwareInterface
{
    use Log\LoggerAwareTrait;
}