Integratietests voor Phoenix-applicaties
Test uw Phoenix-controllers, -views en -channels om te controleren of de verschillende onderdelen van uw webapplicatie samenwerken.
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
endGET-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
endPOST-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
endGegenereerde 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
endOmleidingen 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
endGebruikerssessies 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
endInleiding 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
endKanaalberichten 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
endSnelle 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.ChannelTesten 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!
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
- Unit testen met ExUnit
- Integratietests voor Phoenix-applicaties
- Mocks, stubs en testgegevens
- Property-based testing met StreamData