我在带有配置文件页面(具有“配置文件视图”页面和“配置文件详细信息”编辑器)的Laravel 5.7应用程序中进行http测试,例如:
$newUser->save();
$testing_user_id = $newUser->id;
$newUserGroup = new UserGroup();
$newUserGroup->group_id = USER_ACCESS_USER;
$newUserGroup->user_id = $newUser->id;
$userGroup= Group::find($newUserGroup->group_id);
$newUserSessionData = [
[
'loggedUserAccessGroups' => ['group_id' => $newUserGroup->group_id, 'group_name' => !empty($userGroup) ? $userGroup->name : ''],
'logged_user_ip' => '0',
]
];
$newUserGroup->save();
// 3. OPEN PROFILE PAGE BLOCK START
$response = $this->actingAs($newUser)
->withSession($newUserSessionData)
->get('/profile/view');
// 3. OPEN PROFILE PAGE BLOCK END
// 4. MAKING CHECKING PROFILE FOR USER CREATED AT 2) BLOCK START
$response->assertStatus(200); // to use HTTP_RESPONSE_OK
$response->assertSee(htmlspecialchars("Profile : " . $newUser->username, ENT_QUOTES));
// 4. MAKING CHECKING PROFILE FOR USER CREATED AT 2) BLOCK END
// 5. OPEN PROFILE DETAILS VIEW PAGE BLOCK START
$response = $this->actingAs($newUser)
->withSession($newUserSessionData)
->get('profile/view');
$response->assertStatus(200);
$response->assertSee(htmlspecialchars("Profile : " . $newUser->username, ENT_QUOTES));
// 5. OPEN PROFILE DETAILS VIEW PAGE BLOCK END
// 6. OPEN PROFILE DETAILS EDITOR PAGE BLOCK START
$response = $this->actingAs($newUser)
->withSession($newUserSessionData)
->get('profile/edit-details'); // http://local-votes.com/profile/edit-details
$response->assertStatus(HTTP_RESPONSE_OK);
$response->assertSee(htmlspecialchars("Profile : Details"));
// 6. OPEN PROFILE DETAILS EDITOR PAGE BLOCK END
// 7. MODIFY PROFILE DETAILS PAGE BLOCK START
$response = $this->actingAs($newUser)
->withSession($newUserSessionData)
->post('profile/edit-details-post', [
'first_name' => 'Modified : ' . $newUser->first_name,
'last_name' => 'Modified : ' . $newUser->last_name,
'phone' => 'Modified : ' . $newUser->phone,
'website' => 'Modified : ' . $newUser->website,
'_token' => $csrf_token
]);
// $response->assertStatus(205); // ???
// 7. MODIFY PROFILE DETAILS PAGE BLOCK END
////////////////////////
// 8. OPEN PROFILE DETAILS VIEW PAGE AFTER MODIFICATIONS BLOCK START
$response = $this->actingAs($newUser)
->withSession($newUserSessionData)
->get('profile/view');
$response->assertStatus(200);
$response->assertSee( htmlspecialchars('Modified : ' . $newUser->last_name) );
// 8. OPEN PROFILE DETAILS VIEW PAGE AFTER MODIFICATIONS BLOCK END
添加了新用户,并且可以正常打开“个人档案视图”页面,但是在步骤// 7出现了问题。修改个人档案详细信息页面开始 正如我在sql trace中看到的那样,新用户已插入但未更新。
在我的控件app / Http / Controllers / ProfileController.php中,更新方法是通过验证请求定义的:
public function update_details(ProfileUserDetailsRequest $request)
{
$userProfile = Auth::user();
$requestData = $request->all();
$userProfile->first_name = $requestData['first_name'];
$userProfile->last_name = $requestData['last_name'];
$userProfile->phone = $requestData['phone'];
$userProfile->website = $requestData['website'];
$userProfile->updated_at = now();
$userProfile->save();
$this->setFlashMessage('Profile updated successfully !', 'success', 'Profile');
return Redirect::route('profile-view');
} // public function update_details(ProfileUserDetailsRequest $request)
1)原因可以在ProfileUserDetailsRequest中,如何处理? 我的个人资料详细信息编辑器可以正常运行。
我的路线定义为:
Route::group(array('prefix' => 'profile', 'middleware' => ['auth', 'isVerified']), function(){
Route::post('edit-details-post', array(
'as' => 'profile-edit-details-post',
'uses' => 'ProfileController@update_details'
));
起初我尝试了PUT,但是之后我尝试了POST-相同但没有结果。
2)您能否建议// //修改用户个人资料详细信息的正确方法?7.修改个人资料详细信息页面的“开始”步骤?
已修改的第2块:
我尝试了补丁方法,但是仍然无法正常工作。 我的app / Http / Controllers / ProfileController.php中有调试方法
public function update_details(ProfileUserDetailsRequest $request)
{
方法,当运行测试时,我看到它没有被触发。 我使用相同的update_details方法在brauser中更新表单,并且效果正常(我也看到了调试信息)。
我想那可能是csrf问题,在我写的测试文件的标题中:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use DB;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\WithoutMiddleware; // Prevent all middleware from being executed for this test class.
public function testProfilePage()
{
$csrf_token = csrf_token();
...
$response = $this->actingAs($newUser)
->withSession($newUserSessionData)
->patch('profile/edit-details-post', [
'first_name' => 'Modified : ' . $newUser->first_name,
'last_name' => 'Modified : ' . $newUser->last_name,
'phone' => 'Modified : ' . $newUser->phone,
'website' => 'Modified : ' . $newUser->website,
// '_token' => $csrf_token / I TRIED TO UNCOMMENT THIS LINE TOO
]);
$response->assertStatus(205); // making this check I see that code 419 was returned
可以决定添加文件app / Http / Middleware / VerifyCsrfToken.php
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
// ???
];
如果在命令行中,我以
运行测试 vendor/bin/phpunit tests/Feature/ProfilepageTest.php
除了我还能添加什么?
谢谢!
答案 0 :(得分:1)
除了PATCH而不是POST之外,我还建议您测试代码。
代替ProfileUserDetailsRequest尝试使用简单的Request。
尝试在更新函数中记录$ request变量,并检查_token和_method是否可用,方法应为PATCH,并且请求变量已正确发布。
制作一个用户表模型,然后尝试使用该模型更新用户
$user = User::find(Auth::user()->id);
…
$user->save();
会话由中间件启动,我认为如果您禁用中间件,则会话将无法工作。
答案 1 :(得分:0)
如果您使用的是Visual Studio Code之类的IDE来运行您的代码,请尝试使用xdebug之类的调试器。在您的update_details方法中放置一个断点,查看它是否要保存并且保存正在执行。如果是,那么我们知道保存未正确更新。
根据更新文档,您似乎在做正确的事情: https://laravel.com/docs/5.7/eloquent#updates来自以下文档的示例:
$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();
我最担心的是为什么失败,我唯一的猜测就是让用户脱离auth对象会导致问题。从用户的auth对象中获取ID,然后使用find()来捕获用户,然后更新其值并保存并查看是否有效。