如何在PHPUnit的assertSame()中设置以换行开头的测试输入?
解决PHPUnit中换行开头的正则匹配测试失败问题
看起来你遇到的核心问题是不同环境下换行符的差异导致正则匹配失效,以及测试输入的写法需要更精准。下面一步步帮你解决:
问题根源分析
你的正则#\n-{3,}#只匹配**LF换行符(\n)**开头的---,但:
- PHP_EOL在Windows环境下是CRLF(\r\n),所以
PHP_EOL . '---'生成的是\r\n---,正则里的\n匹配不到前面带\r的情况; - 你第三个测试输入写的
' ---'(注释说有换行)实际字符串里是空格+---,根本没有换行,自然匹配失败; - 前端正常是因为Markdown文件通常用LF换行,和正则的
\n完全匹配,而PHPUnit运行环境可能是Windows,换行符不一致。
解决方案
1. 优化正则,适配所有换行符
把正则改成支持任意换行符的写法,PHP正则里可以用\R(匹配所有换行序列:LF、CRLF、CR等),这样不管什么环境都能匹配:
$pattern = '#\R-{3,}#';
如果需要更精准(只匹配LF或CRLF),也可以写成:
$pattern = '#(?:\r\n|\n)-{3,}#';
2. 编写精准的测试输入
测试时不要依赖PHP_EOL(避免环境差异),直接用明确的换行符:
public function testHrReplacement() { $yourParser = new YourParserClass(); // 测试仅LF换行开头的情况 $input = "\n---"; $this->assertSame('<hr/>', $yourParser->parse($input)); // 测试仅CRLF换行开头的情况(适配Windows环境) $input = "\r\n---"; $this->assertSame('<hr/>', $yourParser->parse($input)); // 测试前面有文本的情况(你提到这个正常,作为对照) $input = "test\n---"; $this->assertSame('test<hr/>', $yourParser->parse($input)); // 测试不匹配的情况(比如前面有空格) $input = " ---"; $this->assertSame(" ---", $yourParser->parse($input)); }
3. 验证正则的匹配逻辑
如果你确实需要严格匹配换行是字符串的开头,可以给正则加上^锚点(注意要开启多行模式m,让^匹配每行开头):
$pattern = '#^\R-{3,}#m';
这样就能确保---是紧跟在换行后的行首内容,避免匹配中间的---。
为什么前端正常?
前端处理的Markdown文件一般是用LF(\n)换行,和你最初的正则\n---完全匹配,所以替换正常;而PHPUnit如果运行在Windows系统,默认的换行符是CRLF,导致原正则匹配失败。
内容的提问来源于stack exchange,提问作者bueltge
相关产品推荐
相关产品推荐

