PHPUnit断言异常:视图中description断言失败但数据已传递
最近写Laravel功能测试时碰到个头疼的问题:同一个测试里的两个assertSee断言,只有检查'title'的能通过,检查'description'的却一直失败。我用dd()确认过控制器已经把description数据传到视图里了,甚至能看到项目的属性里description明明有值:
#attributes: array:5 [▼ "id" => 1 "title" => "First Project" "description" => "asdsdasdsadsadsadsadsa" ... ]
但PHPUnit就是报错说返回的HTML里没检测到"description",可实际视图明明已经渲染了这个内容。
我的测试代码是这样的:
/** @test */ public function a_user_can_view_a_project(){ $this->withoutExceptionHandling(); $project = factory('App\Project')->create(); $this->get('/projects/'.$project->id)->assertSee('title')->assertSee('description'); }
可能的解决思路
核心可能:断言的是字面量而非实际数据
你现在的assertSee('title')和assertSee('description')是在检查页面里有没有title和description这两个单词,而不是检查项目的实际标题和描述内容!如果你的视图里只是渲染了{{ $project->title }}和{{ $project->description }},但没有出现title或description这些标签文字(比如没有写<span>Title:</span>),那assertSee('title')能通过可能只是巧合(比如页面其他地方刚好有这个单词),而assertSee('description')失败是因为页面里根本没这个单词。正确的做法应该是断言项目的实际值:$this->get('/projects/'.$project->id) ->assertSee($project->title) ->assertSee($project->description);检查视图变量是否写错
确认视图里是不是正确调用了$project->description,有没有笔误(比如写成$project->desc或者$description),毕竟手滑打错变量名太容易犯了。查看实际响应的HTML内容
把测试代码改成这样,直接打印出返回的HTML,就能直观看到页面里到底有没有你要找的内容:$response = $this->get('/projects/'.$project->id); dd($response->getContent()); // 打印实际返回的HTML $response->assertSee('description');这样你就能清楚看到是页面里真的没这个内容,还是PHPUnit的匹配逻辑有问题。
检查是否存在HTML转义问题
如果description内容里有特殊字符(比如<、>),用assertSee()可能会因为HTML转义而匹配失败,这时候可以试试用assertSeeHtml()来匹配转义后的内容,或者直接用原始的项目description值来断言。
内容的提问来源于stack exchange,提问作者Nikocevic Stefan

