我需要为我的工作写一个Unittest,但我以前没有任何PHP知识。
Unittest给了我一个错误,我的参数with::format需要是其他相关过滤器的实例。问题是我不允许更改任何过滤器,我只需要编写Unittest。
所以我的问题是,还有其他解决办法吗?
如果有人想帮助我,我将非常感激
<?php
declare(strict_types=1);
namespace Horde\Log\Formatter;
use Horde\Log\LogFormatter;
use Horde\Log\LogMessage;
use InvalidArgumentException;
class SimpleFormatter implements LogFormatter
{
protected $format;
public function __construct($options = null)
{
$format = (is_array($options) && isset($options['format']))
? $options['format']
: $options;
if (is_null($format)) {
$format = '%timestamp% %levelName%: %message%' . PHP_EOL;
}
if (!is_string($format)) {
throw new InvalidArgumentException('Format must be a string');
}
$this->format = $format;
}
public function format(LogMessage $event): string
{
$output = $this->format;
$context = $event->context();
$context['message'] = $event->formattedMessage();
foreach ($context as $name => $value) {
$output = str_replace("%$name%", $value, $output);
}
return $output;
}
}
<?php
namespace Horde\Log\Test\Formatter;
use PHPUnit\Framework\Testcase;
use Horde\Log\Formatter\SimpleFormatter;
use Horde\Log\LogMessage;
use Horde\Log\LogFormatter;
class SimpleFormatterTest extends TestCase
{
public function testConstructorThrowsOnBadFormatString()
{
$this->expectException('InvalidArgumentException');
new SimpleFormatter(1);
}
public function testDefaultFormat()
{
$f = new SimpleFormatter();
$line = $f->format(array('message' => $message = 'message',
'level' => $level = SimpleFormatterTest::ALERT,
'levelName' => $levelName = 'ALERT'));
$this->assertStringContainsString($message, $line);
$this->assertStringContainsString($levelName, $line);
}
}
您不应该将数组传递到格式化方法。格式化方法需要一类类型为logmail的
$f = new SimpleFormatter();
$message = new LogMessage(..some parameters);
$line = $f->format( $message );
$this->assertStringContainsString($message, $line);
$this->assertStringContainsString($levelName, $line);
像这样的东西。它与单元测试无关。这是基本的编程原则.你可以把任何东西都放到一个方法中