Laravel 5:assertSeeText()与HTML实体匹配失败问题求助
解决Laravel测试中assertSeeText因HTML实体转义失败的问题
这个问题我之前也碰到过,核心原因是Blade模板的自动转义机制:当你用{{ $site->name }}输出内容时,Laravel会把特殊字符(比如撇号')转换成对应的HTML实体('),而assertSeeText()是在响应的原始文本中查找未转义的原始字符串,自然就匹配不上了。
这里有几个简单的解决办法:
方法1:使用assertSeeHtml()替代assertSeeText()
Laravel提供了专门匹配HTML实体的断言方法,它会自动处理转义后的字符:
$siteShow = factory(Site::class)->create(); $this->get('admin/site/'. $siteShow->id_site) ->assertStatus(200) ->assertSeeHtml($siteShow->name); // 用这个方法代替assertSeeText
方法2:手动转义字符串后再断言
如果你还是想用assertSeeText(),可以先用Laravel的e()辅助函数(或者PHP原生的htmlspecialchars())把原始字符串转成HTML实体,再和响应文本匹配:
$siteShow = factory(Site::class)->create(); $this->get('admin/site/'. $siteShow->id_site) ->assertStatus(200) ->assertSeeText(e($siteShow->name)); // 转义后再断言
额外提醒:确认模板输出方式
如果你的模板里用的是{!! $site->name !!}(不转义输出),那assertSeeText()本来就应该能匹配到,但这种方式有XSS风险,除非你确定内容是安全的,否则不建议这么做。
内容的提问来源于stack exchange,提问作者SystemGlitch
相关产品推荐
相关产品推荐

