2

私はこの質問をほぼ同じ課題(および回答)で研究してきました

- ただし、私のものは信じられないほどローテクなので、自分自身の洞察力の欠如を完全に恥ずかしく思っています <:/

システム

macOS 10.11.6

$ mix -v
Erlang/OTP 19 [erts-8.0.2] [source] [64-bit] [smp:8:8] [async-threads:10][hipe] [kernel-poll:false] [dtrace]

Mix 1.3.2

痕跡

$ mix test
...

  1) test /api/v1/blogs#index returns a list of blogs (ScoutServer.BlogControllerTest)
     test/controllers/blog_controller_test.exs:5
     ** (Plug.Conn.AlreadySentError) the response was already sent
     stacktrace:
       (plug) lib/plug/conn.ex:459: Plug.Conn.resp/3
       (plug) lib/plug/conn.ex:446: Plug.Conn.send_resp/3
       (scout_server) web/controllers/blog_controller.ex:1: ScoutServer.BlogController.action/2
       (scout_server) web/controllers/blog_controller.ex:1: ScoutServer.BlogController.phoenix_controller_pipeline/2
       (scout_server) lib/scout_server/endpoint.ex:1: ScoutServer.Endpoint.instrument/4
       (scout_server) lib/phoenix/router.ex:261: ScoutServer.Router.dispatch/2
       (scout_server) web/router.ex:1: ScoutServer.Router.do_call/2
       (scout_server) lib/scout_server/endpoint.ex:1: ScoutServer.Endpoint.phoenix_pipeline/1
       (scout_server) lib/scout_server/endpoint.ex:1: ScoutServer.Endpoint.call/2
       test/controllers/blog_controller_test.exs:17: (test)

.

Finished in 0.1 seconds
5 tests, 1 failure

Randomized with seed 210569

web/router.ex

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

scope "/api/v1", ScoutServer do
  pipe_through :api
  resources "/blogs", BlogController
end

test/test_helper.exs

# Add this above `ExUnit.start`
defmodule ScoutServer.Case do
  use ExUnit.CaseTemplate
  alias ScoutServer.Repo

  setup do
    # Explicitly get a connection before each test
    :ok = Ecto.Adapters.SQL.Sandbox.checkout(Repo)
  end

  using do
    quote do
      alias ScoutServer.Repo
      use Plug.Test

      # Remember to change this from `defp` to `def` or it can't be used in your
      # tests.
      def send_request(conn) do
        conn
        |> put_private(:plug_skip_csrf_protection, true)
        |> ScoutServer.Endpoint.call([])
      end

    end
  end
end

ExUnit.start

Ecto.Adapters.SQL.Sandbox.mode(ScoutServer.Repo, :manual)

テスト/コントローラー/blog_controller_test.exs

defmodule ScoutServer.BlogControllerTest do
  use ScoutServer.Case, async: false
  alias ScoutServer.Blog

  test "/api/v1/blogs#index returns a list of blogs" do
    blogs =
      %Blog{title: "scout", content: "scouting"}
      |> Repo.insert
      |> List.wrap
    blogs_as_json = Repo.all(Blog)
      |> Poison.encode!(blogs)

    # conn = get conn, "/api/v1/blogs"
    # assert html_response(conn, 200) =~ blogs_as_json

    response = conn(:get, "/api/v1/blogs", blogs_as_json)
      |> send_request

    assert response.status == 200
    assert response.resp_body == blogs_as_json
  end

end
4

1 に答える 1

4

blog_controller_test.ex に夢中になりすぎて、本物のことをすっかり忘れてしまいました :(

defmodule ScoutServer.BlogController do
  use   ScoutServer.Web, :controller
  alias ScoutServer.Blog

  # plug :action - not sure why, but without the comment the test fails!

  def index(conn, _params) do
    blogs = Repo.all(Blog)
    render conn, blogs: blogs
  end
end

しかし幸運なことに、Pawel Duda は私の「消費」から私を解放してくれました - thx Pawel!

実際、プラグイン:アクションは過去のものですこれも、ウェブが実際に時間/空間に依存していることを証明しています:)

于 2016-09-08T05:42:15.317 に答える