Chr*_*ian 2 php testing phpunit interface traits
让我们psr/log特别看一下中的代码:
如您所知,特征无法实现接口,因此这两部分需要一个类才能成功连接在一起。
假设我涵盖了特性测试(通过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
}
Run Code Online (Sandbox Code Playgroud)
这里有一些问题:
eval()尽可能地避免(即使我知道反正是驱动PHPUnit的原因),但是..因此,最大的问题是,还有其他选择吗?
仅将类创建为测试资产怎么样:
namespace Foo\Bar\Test\Asset;
use Psr\Log;
final class LoggerAware implements Log\LoggerAwareInterface
{
use Log\LoggerAwareTrait;
}
Run Code Online (Sandbox Code Playgroud)
然后断言它实现了接口:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |