我有几个与phpunit的集成测试, 在测试过程中,有一些日志写入系统中的文件。
我想检查测试期间是否写了一行,是否可能?
示例:
/** @test */
function action_that_writes_to_log() {
$this->call('GET', 'path/to/action', [], [], $requestXml);
//I want this:
$this->assertFileHas('the log line written', '/log/file/path.log');
}
答案 0 :(得分:1)
显而易见的方式:
实现自定义断言方法,就像您建议的那样:assertFileHas
。这很简单,只需检查字符串是否出现在文件中。您可以得到的问题是该行已经存在于另一个测试或已经运行的相同测试中。可能的解决方案是在每个测试或测试类之前删除日志内容,具体取决于您的需要。您需要一种删除日志并从setUp
或setUpBeforeClass
调用日志的方法。
我会采用另一种方法:模拟日志记录组件,并检查正确的调用是否正在进行:
$logger_mock->expects($this->once())
->method('log')
->with($this->equalTo('the log line written'));
这样可以轻松测试组件是否记录正确的消息,但您还需要实现一个测试,以验证记录器是否能够实际写入文件。但是实现该测试一次更容易,然后检查每个组件是否调用了日志记录方法。