Elixir en Phoenix: schaalbare backendontwikkeling · Les

Integratietests voor Phoenix-applicaties

Test uw Phoenix-controllers, -views en -channels om te controleren of de verschillende onderdelen van uw webapplicatie samenwerken.

Les 2 van 412 stappen

Integratietests voor Phoenix-applicaties is een gratis Elixir en Phoenix: schaalbare backendontwikkeling-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Elixir en Phoenix: schaalbare backendontwikkeling. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Elixir en Phoenix: schaalbare backendontwikkeling bevat in totaal 4 lessen.

Interactie met een webapp testen

Welkom bij integratietests voor Phoenix-toepassingen! Terwijl unit tests afzonderlijke onderdelen controleren, zorgen integratietests ervoor dat verschillende delen van je webtoepassing naadloos samenwerken.

  • Ze simuleren interacties van echte gebruikers.
  • Ze omvatten routes, controllers, weergaven en kanalen.
  • Ze geven je vertrouwen dat de belangrijkste stromen van je toepassing correct werken.

HTTP-aanvragen simuleren

Phoenix.ConnTest is je belangrijkste hulpmiddel voor het testen van HTTP-aanvragen. Hiermee kun je aanvragen (GET, POST, PUT, DELETE) naar je Phoenix-toepassing simuleren zonder een actieve server nodig te hebben.

We gebruiken functies zoals get/2, post/3 en put/3 om aanvragen te versturen en vervolgens beweringen te doen over de resulterende verbinding (conn).

defmodule MyPhoenixAppWeb.ExampleTest do
  use ExUnit.Case, async: true
  import Phoenix.ConnTest

  # Assume a simple router route: get "/hello", PageController, :hello
  # and PageController.hello renders a page with "Hello World"
  test "can get a simple page" do
    # Simulate a GET request to /hello
    conn = get("/hello")

    # Assert the HTTP status code
    assert conn.status == 200

    # Assert the response body contains "Hello World"
    assert html_response(conn, 200) =~ "Hello World"
  end
end

GET-aanvragen testen

GET-aanvragen worden meestal gebruikt om gegevens op te halen of pagina's weer te geven. Tijdens het testen simuleer je de aanvraag en doe je vervolgens beweringen over de statuscode en inhoud van het antwoord.

Gebruik html_response/2 om de HTML-tekst op te halen en controleer de inhoud met patroonvergelijking (=~).

defmodule MyPhoenixAppWeb.PostControllerTest do
  use ExUnit.Case, async: true
  import Phoenix.ConnTest

  # Assume we have a router route: get "/posts", PostController, :index
  # And PostController.index renders a list of posts including "My First Post"
  test "lists all posts on GET /posts" do
    # Simulate a request to the /posts endpoint
    conn = get("/posts")

    # Assert that the request was successful and contains expected content
    assert conn.status == 200
    assert html_response(conn, 200) =~ "<h1>All Posts</h1>"
    assert html_response(conn, 200) =~ "My First Post"
  end
end

POST-aanvragen testen

POST-aanvragen worden vaak gebruikt om nieuwe bronnen te maken of formuliergegevens te versturen. Tijdens het testen geef je parameters mee met de aanvraag.

Na een geslaagde aanmaak sturen controllers vaak een omleiding. Gebruik redirected_to/1 om het pad van de omleiding te controleren.

defmodule MyPhoenixAppWeb.PostControllerTest do
  use ExUnit.Case, async: true
  import Phoenix.ConnTest

  # Assume we have a router route: post "/posts", PostController, :create
  # This action creates a post and redirects to the index page.
  test "creates a new post on POST /posts" do
    post_params = %{"post" => %{"title" => "New Post", "body" => "Content"}}

    # Simulate a POST request with parameters
    conn = post("/posts", post_params)

    # Assert that a redirect occurred to the posts index
    assert redirected_to(conn) == "/posts"
  end
end

Gegenereerde inhoud controleren

Het is cruciaal om te controleren of je weergaven de juiste gegevens en structuur weergeven. Met html_response/2 kun je de weergegeven HTML als tekenreeks ophalen.

Vervolgens kun je tekenreeksbeweringen of reguliere expressies gebruiken om specifieke tekst, HTML-tags of dynamische inhoud te controleren.

defmodule MyPhoenixAppWeb.PageControllerTest do
  use ExUnit.Case, async: true
  import Phoenix.ConnTest

  # Assume get "/dashboard" renders a page with user information
  test "renders dashboard with user info" do
    # For this example, we simulate a simple GET (no session handling here)
    conn = get("/dashboard")

    assert conn.status == 200
    response_html = html_response(conn, 200)

    # Check for specific elements in the rendered HTML
    assert response_html =~ "<title>Dashboard</title>"
    assert response_html =~ "<span>Welcome, John Doe!</span>"
    assert response_html =~ ~r/Last Login: \d{4}-\d{2}-\d{2}/ # Regex for dynamic date
  end
end

Omleidingen en fouten testen

Het testen van de gebruikersstroom is essentieel. Phoenix biedt hulpfuncties om omleidingen en foutreacties te controleren:

  • assert_redirected_to(conn, path): controleert een omleiding naar een specifiek pad.
  • assert_error_sent(conn, status): controleert een HTTP-foutstatuscode.
  • json_response(conn, status): haalt een JSON-body uit een API-fout.
defmodule MyPhoenixAppWeb.AuthControllerTest do
  use ExUnit.Case, async: true
  import Phoenix.ConnTest

  # Assume post "/login" redirects to /dashboard on success
  test "redirects after successful login" do
    login_params = %{"email" => "test@example.com", "password" => "password"}
    conn = post("/login", login_params)
    assert redirected_to(conn) == "/dashboard"
  end

  # Assume post "/register" sends a 400 error for invalid data
  test "sends 400 error for invalid registration" do
    invalid_params = %{"email" => "bad", "password" => "short"}
    conn = post("/register", invalid_params)
    assert conn.status == 400
    assert json_response(conn, 400) == %{"errors" => %{"email" => ["is invalid"]}}
  end
end

Gebruikerssessies simuleren

Veel webtoepassingen zijn afhankelijk van sessies om de status bij te houden, bijvoorbeeld of een gebruiker is ingelogd. In toetsen kun je de sessie van de verbinding handmatig aanpassen om verschillende gebruikersstatussen te simuleren.

Gebruik build_conn/0 om een nieuwe verbinding te maken en gebruik vervolgens put_session/3 om sessiegegevens toe te voegen voordat je je verzoek uitvoert.

defmodule MyPhoenixAppWeb.SessionControllerTest do
  use ExUnit.Case, async: true
  import Phoenix.ConnTest

  # Assume get "/profile" requires a user_id in the session
  test "accesses profile with session data" do
    # Build a connection and add a user_id to its session
    conn = 
      build_conn()
      |> put_session(:user_id, 123)
      |> get("/profile")

    assert conn.status == 200
    assert html_response(conn, 200) =~ "User Profile for ID: 123"
  end

  test "redirects unauthenticated users" do
    # No session data means no authenticated user
    conn = get("/profile")
    assert redirected_to(conn) == "/login"
  end
end

Inleiding tot het testen van kanalen

Phoenix Channels zijn bedoeld voor realtimecommunicatie via WebSockets. Integratietoetsen voor kanalen controleren of clients correct verbinding kunnen maken, zich bij onderwerpen kunnen aansluiten, berichten kunnen verzenden en uitzendingen kunnen ontvangen.

Dit is cruciaal voor chattoepassingen, live dashboards en elke functie waarvoor directe updates nodig zijn.

Verbinding maken met een kanaal

Phoenix.ChannelTest biedt functies om te simuleren dat een client verbinding maakt met je WebSocket en zich aansluit bij specifieke kanaalonderwerpen. De belangrijkste functie die je gebruikt is subscribe_and_join/3.

Deze functie retourneert {:ok, pid, socket}, waarbij socket de verbinding van de client met het kanaal voorstelt.

defmodule MyPhoenixAppWeb.ChatChannelTest do
  use ExUnit.Case, async: true
  use Phoenix.ChannelTest

  # Assume MyPhoenixAppWeb.UserSocket is your main WebSocket module
  # and it handles joining a "room:lobby" channel.
  test "can join the lobby channel" do
    # Simulate a client connecting and joining "room:lobby" with no params
    {:ok, _pid, socket} = subscribe_and_join(MyPhoenixAppWeb.UserSocket, "room:lobby", %{})

    # Assert that the socket is connected to the correct topic
    assert socket.topic == "room:lobby"

    # You might also assert on assigns set during the join process
    # assert socket.assigns.user_id # If user_id is assigned on join
  end
end

Kanaalberichten verzenden en ontvangen

Zodra je met een kanaal bent verbonden, kun je de berichtenstroom testen. Gebruik push/3 om te simuleren dat een client een bericht naar de server verzendt, en assert_broadcast/2 om te controleren of de server berichten terug naar het onderwerp uitzendt.

Met assert_reply/3 kun je antwoorden op specifieke pushes van de client controleren.

defmodule MyPhoenixAppWeb.ChatChannelTest do
  use ExUnit.Case, async: true
  use Phoenix.ChannelTest

  # Assume MyPhoenixAppWeb.UserSocket handles "new_msg" events on "room:lobby"
  test "broadcasts messages to the lobby" do
    {:ok, _pid, socket} = subscribe_and_join(MyPhoenixAppWeb.UserSocket, "room:lobby", %{})

    # Simulate pushing a message from the client
    ref = push(socket, "new_msg", %{"body" => "Hello everyone!"})

    # Assert that the server replied 'ok' to the push
    assert_reply ref, :ok

    # Assert that a message was broadcasted back to the topic
    assert_broadcast "new_msg", %{"body" => "Hello everyone!"}
  end
end

Snelle controle

Laten we controleren of je integratietoetsen in Phoenix begrijpt.

Samenvatting: vertrouwen door integratie

Je hebt geleerd hoe je robuuste integratietoetsen voor je Phoenix-toepassingen schrijft!

  • We hebben besproken hoe je HTTP-verzoeken simuleert met Phoenix.ConnTest.
  • Je weet nu hoe je GET- en POST-verzoeken test, weergegeven HTML controleert en omleidingen en fouten verifieert.
  • We hebben ook onderzocht hoe je realtimefuncties test met Phoenix.ChannelTest en verbindingen van clients en berichtenstromen simuleert.

Door deze toetsen te schrijven, krijg je er vertrouwen in dat de onderdelen van je toepassing samenwerken zoals bedoeld. Dat leidt tot stabielere en betrouwbaardere webservices!

Gratis beginnen

Leer Elixir met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
12
Lessen
48

Veelgestelde vragen

Is de les “Integratietests voor Phoenix-applicaties” gratis?

Ja — de volledige tekst van “Integratietests voor Phoenix-applicaties” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Elixir en Phoenix: schaalbare backendontwikkeling wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Elixir en Phoenix: schaalbare backendontwikkeling bevat in totaal 4 lessen.

Wat leer ik in “Integratietests voor Phoenix-applicaties”?

Test uw Phoenix-controllers, -views en -channels om te controleren of de verschillende onderdelen van uw webapplicatie samenwerken. Je oefent met Elixir en Phoenix: schaalbare backendontwikkeling door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Elixir en Phoenix: schaalbare backendontwikkeling te beginnen?

Ervaring vooraf is niet nodig. Elixir en Phoenix: schaalbare backendontwikkeling op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Integratietests voor Phoenix-applicaties”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Elixir en Phoenix: schaalbare backendontwikkeling?

Ja. Elke les over Elixir en Phoenix: schaalbare backendontwikkeling bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Unit testen met ExUnit
  2. Integratietests voor Phoenix-applicaties
  3. Mocks, stubs en testgegevens
  4. Property-based testing met StreamData
← Terug naar Elixir en Phoenix: schaalbare backendontwikkeling