Ole Spaarmann
Ole Spaarmann

Reputation: 16749

Elixir Phoenix: Strange "no function clause matching" error in Controller Test

My tests for a controller are failing and I cannot figure out the root of this error. I tried everything I could think of and am a bit helpless since the error message is quite generic.

The error message in question (when running the tests).

1) test does not create resource and renders errors when data is invalid (MyApp.AdminControllerTest)
   test/controllers/admin_controller_test.exs:21
   ** (FunctionClauseError) no function clause matching in MyApp.AdminControllerTest.__ex_unit_setup_1/1
   stacktrace:
     test/controllers/admin_controller_test.exs:8: MyApp.AdminControllerTest.__ex_unit_setup_1(%{async: false, case: MyApp.AdminControllerTest, file: "~/MyApp/test/controllers/admin_controller_test.exs", line: 21, test: :"test does not create resource and renders errors when data is invalid"})
     test/controllers/admin_controller_test.exs:1: MyApp.AdminControllerTest.__ex_unit__/2



2) test creates and renders resource when data is valid (MyApp.AdminControllerTest)
   test/controllers/admin_controller_test.exs:12
   ** (FunctionClauseError) no function clause matching in MyApp.AdminControllerTest.__ex_unit_setup_1/1
   stacktrace:
     test/controllers/admin_controller_test.exs:8: MyApp.AdminControllerTest.__ex_unit_setup_1(%{async: false, case: MyApp.AdminControllerTest, file: "~/MyApp/test/controllers/admin_controller_test.exs", line: 12, test: :"test creates and renders resource when data is valid"})
     test/controllers/admin_controller_test.exs:1: MyApp.AdminControllerTest.__ex_unit__/2

My Code:

admin_controller_test.exs

defmodule MyApp.AdminControllerTest do
  use MyApp.ConnCase

  alias MyApp.Admin
  @valid_attrs %{email: "[email protected]", password: "s3cr3t"}
  @invalid_attrs %{}

  setup %{conn: conn} do
    {:ok, conn: put_req_header(conn, "accept", "application/json")}
  end

  test "creates and renders resource when data is valid", %{conn: conn} do
    conn = post conn, admin_path(conn, :create), admin: @valid_attrs
    body = json_response(conn, 201)
    assert body["data"]["id"]
    assert body["data"]["email"]
    refute body["data"]["password"]
    assert Repo.get_by(Admin, email: "[email protected]")
  end

  test "does not create resource and renders errors when data is invalid", %{conn: conn} do
    conn = post conn, admin_path(conn, :create), admin: @invalid_attrs
    assert json_response(conn, 422)["errors"] != %{}
  end

end

admin_controller.ex

defmodule MyApp.AdminController do
  use MyApp.Web, :controller

  alias MyApp.Admin

  plug :scrub_params, "admin" when action in [:create]

  def create(conn, %{"admin" => admin_params}) do
    changeset = Admin.registration_changeset(%Admin{}, admin_params)

    case Repo.insert(changeset) do
      {:ok, admin} ->
        conn
        |> put_status(:created)
        |> render("show.json", admin: admin)
      {:error, changeset} ->
        conn
        |> put_status(:unprocessable_entity)
        |> render(MyApp.ChangesetView, "error.json", changeset: changeset)
    end
  end
end

And finally parts of my router.ex

defmodule MyApp.Router do
  # [...]

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/api/v1", MyApp do
    pipe_through :api

    resources "/admins", AdminController, only: [:create]
  end

  # [...]
end

Any help is greatly appreciated! Thanks

Upvotes: 2

Views: 4608

Answers (1)

Gazler
Gazler

Reputation: 84150

The error is coming from:

setup %{conn: conn} do

Change this to:

setup do

Upvotes: 4

Related Questions