Laravel: проверка характеристик не пройдена из-за добавления промежуточного программного обеспечения - PullRequest
0 голосов
/ 05 апреля 2020

После того, как пользователь зарегистрируется и подтвердит свою электронную почту, он должен завершить регистрацию с дополнительной информацией. Это происходит в /register/complete-signup

. Эта проблема для меня абсолютно бессмысленна.

По какой-то причине, когда я добавил свое Middleware has-not-completed-signup, тест начинает давать сбой, потому что приложение \ Пользователь нет больше ассоциируется приложение \ учетная запись, которая происходит в контроллере через attach()

Как только я удаляю промежуточное ПО из маршрута, он работает нормально.

Мое промежуточное программное обеспечение предназначено для того, чтобы пользователь, который уже прошел регистрацию, не посетил или не разместил сообщения на этих маршрутах. Я протестировал в браузере и редирект работает. Метод контроллера используется в тесте, и я могу dd($account->users) и получить правильный ответ. Но если я сделаю $user->accounts, коллекция будет пустой.

После удаления промежуточного программного обеспечения $user->accounts больше не будет пустым. Но я сделал dd() внутри своего промежуточного программного обеспечения, и оно даже не работает (что правильно, потому что у пользователя нет учетной записи).

Так с чего бы это не получилось? Я полностью потерян.

Я попытался включить всю необходимую информацию ниже. Если вам нужно что-то еще, пожалуйста, дайте мне знать.

Редактировать:

В моем промежуточном программном обеспечении я прокомментировал функциональность. Что-то в проверке красноречивых отношений заставляет меня проваливать тест. Я понятия не имею, почему.

Это делает тест неудачным:

if (!auth()->user()->accounts->isEmpty()) {      
  //return redirect(RouteServiceProvider::HOME);
}

Если, например, я заменяю его на что-то бесполезное, как это, это работает:

if (auth()->user()) {
//return redirect(RouteServiceProvider::HOME);
}

Я могу сделать $account->users, но $user->accounts возвращает пустую коллекцию на контроллере, когда я использую свое промежуточное ПО


Оригинал:

Вот мои маршруты:

// auth scaffolding
Auth::routes(['verify' => true]);

// main app routes
Route::middleware('verified', 'auth')->group(function() {

    // User verified and has an App\Account
    Route::middleware('completed-signup')->group(function() {
        Route::get("/", 'HomeController@index' )->name('home');
        Route::get('/paywall', 'BillingController@paywall')->name('paywall');

    });

    // The user hasn't attached an App\Account to their User
    Route::middleware('has-not-completed-signup')->group(function() {
        Route::get("/register/complete-signup", 'AccountController@showCompleteSignup' )->name('complete-signup');
        Route::post('/register/complete-signup', 'AccountController@storeCompleteSignup')->name('complete-signup.store');
    });

});

has-not-completed-signup Промежуточное ПО:

    public function handle($request, Closure $next)
    {
        if (auth()->user()->hasCompletedAccountSetup()) {

            return redirect(RouteServiceProvider::HOME);
        }

        return $next($request);
    }

Приложение / Пользовательский метод:

Class User extends Authenticatable implements MustVerifyEmail { 
...

    public function accounts() {
        return $this->belongsToMany('App\Account', 'account_role_user')->withPivot('role_id');
    }
    public function hasCompletedAccountSetup() {
        return !$this->accounts->isEmpty();
    }
    ...

AccountController@storeCompletedSignup:

    public function storeCompleteSignup(Request $request) {

        $validatedData = $request->validate([
            'company' => 'required|max:255',
            'contact_state' => 'required|max:255',
            'contact_country' => 'required|max:255',
            'contact_zip' => 'required|max:255',
            'contact_city' => 'required|max:255',
            'contact_phone' => 'nullable|max:255',
            'contact_address_1' => 'required|max:255',
            'contact_address_2' => 'nullable|max:255',
            'contact_first_name' => 'required',
            'contact_last_name' => 'required',
            'contact_email' => 'required'
        ]);

        $user = auth()->user();

        $account = new Account($validatedData);

        $account->contact_first_name = $user->first_name;
        $account->contact_last_name = $user->last_name;
        $account->contact_email = $user->email;

        $account->save();



        $account->users()->attach(
            $user->id, 
            ['role_id' => Role::where('name', 'owner')->first()->id ]
        );

        return $request->wantsJson()
                    ? new Response('Signup Completed Successfully', 201)
                    : redirect()->route('/');

    }

Мой тест:


    /**
     * @test
     */
    public function a_user_can_complete_signup()
    {


        $user = Factory('App\User')->create();
        $this->actingAs($user);

        $accountAttributes = factory('App\Account')->raw([
            'contact_first_name' => "TEST",
            'contact_last_name' => $user->last_name,
            'contact_email' => $user->email,
            'contact_country' => "USA"
        ]);

        $res = $this->post('/register/complete-signup', $accountAttributes);

        $res->assertSessionDoesntHaveErrors();

        $this->assertTrue( !$user->accounts->isEmpty() ); // THIS FAILS
        $this->assertTrue( $user->accounts->first()->company == $accountAttributes['company']);
        $this->assertTrue( $user->accounts->first()->contact_first_name == $user->first_name );


    }

1 Ответ

0 голосов
/ 06 апреля 2020

На самом деле проблема была не в промежуточном программном обеспечении, а в том, что мне пришлось обновить sh модель после теста POST.

$this->assertTrue( !$user->accounts->isEmpty() );

стать

$this->assertTrue( !$user->fresh()->accounts->isEmpty() );

, который прошел тест.

Я знал о методах fresh и refresh(), но промежуточное программное обеспечение, вызывающее проблему, не создавало смысл для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...