作者:淡而有味调_740 | 来源:互联网 | 2023-01-30 09:59
让我们psr/log
特别看一下中的代码:
LoggerAwareTrait
LoggerAwareInterface
如您所知,特征无法实现接口,因此这两部分需要一个类才能成功连接在一起。
假设我涵盖了特性测试(通过PHPUnit相对容易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> localheinz..:
仅将类创建为测试资产怎么样:
namespace Foo\Bar\Test\Asset;
use Psr\Log;
final class LoggerAware implements Log\LoggerAwareInterface
{
use Log\LoggerAwareTrait;
}
然后断言它实现了接口:
namespace Foo\Bar\Test;
use PhpUnit\Framework;
use Psr\Log;
final class LoggerAwareTest extends Framework\TestCase
{
public function testImplementsLoggerAwareInterface()
{
$loggerAware = new Asset\LoggerAware();
$this->assertInstanceOf(Log\LoggerAwareInterface::class, $loggerAware);
}
}