Beim Testen von Controllern kann es nützlich sein, einige Daten in der Testdatenbank zu haben. Und manchmal möchten Sie vielleicht die Datenerstellung testen. Was ist der richtige Weg dies einzurichten? Ein Test für Controller sollte testen, ob die create
Funktion des Controllers funktioniert, nicht das Modell.Elixier: Wie Phoenix Controller zu testen, wenn sie Datensätze in der Datenbank benötigen? Mit Samen oder Spott?
Als Beispiel möchte ich einen Session-Controller testen und ich habe zwei Tests. Einer testet, dass ein erstellter Benutzer sich anmelden kann. Der andere kann er nicht, wenn das Passwort falsch ist. Beide verlassen sich darauf, dass ein Benutzer in der Datenbank ist. Wie ich damit jetzt umgehen ist, den Benutzer erstellen zuerst:
defmodule MyApp.SessionControllerTest do
use MyApp.ConnCase
alias MyApp.Admin
@valid_attrs %{email: "[email protected]", name: "John Doe", password: "goodpassword", password_confirmation: "goodpassword", password_hash: "somecontent", username: "username"}
@invalid_attrs %{}
setup do
{:ok, conn: put_req_header(conn, "accept", "application/json")}
end
test "admin can login after creation" do
conn = post conn, admin_path(conn, :create), admin: @valid_attrs
body = json_response(conn, 201)
assert Repo.get_by(Admin, email: @valid_attrs[:email])
conn = post conn, session_path(conn, :create), %{data: %{attributes: %{email: @valid_attrs[:email], password: @valid_attrs[:password]}}}
body = json_response(conn, 201)
assert body["data"]["token"]
end
test "login with wrong password returns an error" do
conn = post conn, session_path(conn, :create), %{data: %{attributes: %{email: @valid_attrs[:email], password: "wrongpassword"}}}
body = json_response(conn, 403)
assert body["error"]
end
end
Wenn ich jetzt hinzufügen eine Einzigartigkeit auf meinem Admin
Modell zurückhalten diese potentiell chaotisch könnte, da, wenn ich einen Benutzer in der Datenbank müssen muss ich sicherstellen, dass dass der Test nicht aufgrund dieser Einschränkung fehlschlägt, sondern weil etwas im getesteten Controller falsch ist. Es ist auch nicht klar, in welcher Reihenfolge die Tests durchgeführt werden, und es ist wie ein Alptraum, mit der Datenerstellung über mehrere Tests hinweg übereinzustimmen.
Ich möchte entweder einen Ort, wo ich am Anfang definieren, welche Daten erstellt werden. Oder verwenden Sie Mocks für den Controller-Test.
Wie ist das möglich?
Da ein Teil seiner Frage Es ging um die Isolation zwischen den Tests, es ist vielleicht erwähnenswert, dass Ecto 2 (derzeit in der Betaversion) gleichzeitige Datenbanktests in einem Sandbox-Umgebung. –
@CodyPoll: Das ist ein sehr netter Hinweis –