Testowanie CRUDa

0

Mam taki test i zwraca mi kod 302 z opisem

Expected response status code [200] but received 302.
Failed asserting that 200 is identical to 302.

Patrzyłem co może być tego przyczyną i ludzie pisali, że może to być spowodowane przekierowaniem na formularz logowania żeby sprawdzić czy użytkownik jest uwierzytelniony. Jedynym rozwiązaniem jakie widziałem było dodanie $this->actingAs($user) jednak po dodaniu tego nadal nie działa.

public function test_user_can_store_employee()
{
    $this->withoutExceptionHandling();

    $user = User::factory()->create();
    $this->actingAs($user);

    $response = $this->json('POST','/employee', [
        'name' => 'Jan',
        'surname' => 'Kowalski',
        'phone' => '501928177',
        'position' => 'praktykant',
        'salary' => 3000,
        'user_id' => $user->id
    ]);

    $response->assertStatus(200);
}

Drugim pytaniem czy podczas testowania CRUDa wszędzie dawać 200 i tylko przy błędnej walidacji zwracać 422? Czy są różne szkoły?

0

W jaki sposób masz zaimplementowane rozwiązanie logowania? Jeśli endpointy masz za jąkać zapora to powinieneś stworzyć logowanie w testach i to najlepiej w jednej metodzie np login(), i dodawać ja na początku testu.Co do testów to powinno testowac się w miarę wszystkie możliwe scenariusze, a w tym jak najbardziej validacje. Bo jak sprawdzisz zwrotkę z validatora? I nie mówię tu o osobnym unit teście dla validatora. Możesz każdy endpoint przetestować jak zachowa się zalogowany z poprawną zwrotką, niezalogowany. Zalogowany ale z błędną zwrotką i błędem validacji. Itp

0
Rulon napisał(a):

W jaki sposób masz zaimplementowane rozwiązanie logowania? Jeśli endpointy masz za jąkać zapora to powinieneś stworzyć logowanie w testach i to najlepiej w jednej metodzie np login(), i dodawać ja na początku testu.Co do testów to powinno testowac się w miarę wszystkie możliwe scenariusze, a w tym jak najbardziej validacje. Bo jak sprawdzisz zwrotkę z validatora? I nie mówię tu o osobnym unit teście dla validatora. Możesz każdy endpoint przetestować jak zachowa się zalogowany z poprawną zwrotką, niezalogowany. Zalogowany ale z błędną zwrotką i błędem validacji. Itp

Logowanie mam z laravela te podstawowe, endpointy mam za middlewarem auth ale $this->actingAs($user) robi to, że ten $user jest uwierzytelniony.

0

302 czyli najprawdopodobniej validacji nie przechodzi a z jakiegoś powodu handler wykrywa twój request jako ze strony html tym samym nie zwraca jsona tylko redirect::back. Coś zainstalowałeś co wyłącza poprawne wykrycie requestu lub coś pomieszałeś.

0
ehhhhh napisał(a):

302 czyli najprawdopodobniej validacji nie przechodzi a z jakiegoś powodu handler wykrywa twój request jako ze strony html tym samym nie zwraca jsona tylko redirect::back. Coś zainstalowałeś co wyłącza poprawne wykrycie requestu lub coś pomieszałeś.

Jakby mi walidacja nie przechodziła to bym dostał taką zwrotkę: screenshot-20221116152212.png

0

Nie, albo 302 albo piękny json z lista pól i errorem, tak wygląda domyślne działanie laravela.

0
ehhhhh napisał(a):

Nie, albo 302 albo piękny json z lista pól i errorem, tak wygląda domyślne działanie laravela.

Nawet z ręki dodałem i przechodzi, to gdzie szukać błędu w takim razie? Ogólnie w kontrolerze po store() mam redirect()->route().

0

a no to widzisz no to jak masz redirect to dostajesz 302, proste. Jeśli robisz rest api to powinieneś mieć return response()->json(['jakas_nazwa' => 'cos tam'])

0

Czyli jest dobrze w tym wypadku, jak oglądałem poradniki do testowania to wszystkie były z api.php, a ja mam zdefiniowane routy w web.php przez to się pewnie zmyliłem.

0

no to jeszcze bardziej mieszasz. W teorii możesz robić na web ale musisz zmienić kilka middlewearów, np wyłączyć csrf token dla endpointów api, dodać sprawdzanie throttlingu itp. Po to jest api by robiąc api z tego korzystać.

0

Nie wiem czy tworzyć osobny wątek do takiej rzeczy więc tutaj będę kontynuował. Trochę problemów sprawia te testowanie pierwszym z nich dla testu

public function test_user_can_edit_clients()
    {
        $this->withoutExceptionHandling();

        $user = User::factory()->create();
        $this->actingAs($user);
        $client = Clients::factory()->create();
        
        $response = $this->json('PUT', "/clients/$client->id", [
            'name' => 'Jan',
            'surname' => 'Kowalski',
            'NIP' => '5019281771',
            'company_name' => 'Firma A',
            'phone' => '123456789',
            'email' => '[email protected]',
            'user_id' => $user->id
        ]);

        $response->assertStatus(302);
    }

Dostaje zwrotkę
screenshot-20221118145240.png
Kiedy mam taką trasę:
screenshot-20221118145356.png
I w formularzu tak samo mam PUT
screenshot-20221118145506.png

0

Totalnie wszystko mieszasz, request budowany jak dla api ale assert jak dla zwykłego formularza. Przy testowaniu formularza powinieneś użyć $this->put(). Dalej pokaż routing bo tam tez coś masz skopane

0
ehhhhh napisał(a):

Totalnie wszystko mieszasz, request budowany jak dla api ale assert jak dla zwykłego formularza. Przy testowaniu formularza powinieneś użyć $this->put(). Dalej pokaż routing bo tam tez coś masz skopane

Czyli json'y pozamieniać na get,post,put,delete.
Jak dam
$this->put("/clients/$client->id", []) a $this->json('PUT',"/clients/$client->id", []) w tym przypadku to chyba i tak nie ma znaczenia bo i to i to zrobi mi request na put (a przynajmniej testowałem czy z put coś się zmieni)
Routing taki

Route::resource('clients', ClientsController::class);
0

Nie do końca, np inne nagłówki lecą a na to laravel zwraca uwagę. Sprawdzę przy chwili w jakiś projekt i dam ci znać jak to wygląda u mnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1