Laravel 7. 我使用 http 測試來檢查我的頁面的可用性狀態(tài)。但我注意到在測試中,我的一項政策的運作方式有所不同??刂破鞣椒ǎ簆ublic function show(Competition $competition){ $competition->load('registeredTeams.user', 'teams.user'); return view('competitions.show', compact('competition'));}對其應用的策略方法:public function view(User $user, Competition $competition){ return $user->id === $competition->user_id;}測試及其內部方法:public function testCompetitionsPageTest(){ $user = $this->loginAsFakeUser(); $user->commissioner = true; $user->save(); $competition = $this->createFakeCompetition($user->id); $this->get('/competitions')->assertOk(); $this->get('/competitions/create')->assertOk(); $this->get('/competitions/' . $competition->id)->assertOk();}protected function loginAsFakeUser(){ $user = User::create(['username' => 'TestUserForTests']); $this->actingAs($user); return $user;}protected function createFakeCompetition(int $user_id){ $competition = new Competition([ 'name' => 'TestCompetitionName', 'type' => competitionTypes()[2], 'tops_number' => 1, 'self_confirm' => 1, 'winner_points' => 3, 'registration_end' => today()->toDateString(), ]); $competition->user_id = $user_id; $competition->save(); return $competition;}當我在瀏覽器中加載測試頁面時,一切正常。但是,當我測試它時,下一個斷言不起作用,因為它返回 403 代碼而不是 200:$this->get('/competitions/' . $competition->id)->assertOk();經(jīng)過一些操作后,我發(fā)現(xiàn)如果我在我的策略中使用非嚴格比較,它可以正常工作:return $user->id === $competition->user_id;你能幫我弄清楚為什么我創(chuàng)建的用戶通過$competition 的 idcreate()和actingAs($user)user_id 字段有不同的類型嗎?
2 回答

回首憶惘然
TA貢獻1847條經(jīng)驗 獲得超11個贊
只是對您發(fā)布的代碼做出一些假設,我認為在測試之外$competition->user_id
是一個string
值,而在測試內部它是一個int
值。你可以很容易地驗證這個假設。
發(fā)生這種情況是因為createFakeCompetition
強制類型int
for $user_id
,因為您在沒有嚴格模式的情況下運行,PHP 將傳遞的字符串轉換為整數(shù),但這會使比較$user->id === $competition->user_id
失敗。
我希望已經(jīng)清楚了。

翻翻過去那場雪
TA貢獻2065條經(jīng)驗 獲得超14個贊
這是因為我的測試數(shù)據(jù)庫類型。它使用了 sqlite,它在檢索結果后只有字符串值。我剛剛從我的 phpunit.xml 中刪除了兩行,以便也使用我的主連接進行測試。
刪除的行: <server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
- 2 回答
- 0 關注
- 141 瀏覽
添加回答
舉報
0/150
提交
取消