2017-04-16 18 views
0

ユーザーにサインインするエンドポイントがあります。私は統合テストとコントローラテストの両方を書いたが、コントローラテストでテストされたエッジケースが多いことを除けば(例:ユーザーが間違った電子メールでログインしようとしている)、非常によく似ている。テストの内容は実際には異なるようには見えないので、誰かがどのように違うべきかを明かすことができれば素晴らしいだろう。フェニックス:API統合テストとコントローラテスト

統合テスト:

defmodule SigningInUserTest do 
    use ParrotApi.ConnCase 
    alias ParrotApi.Router 

    @opts Router.init([]) 
    describe "POST api/v1/sessions" do 
    test "success" do 
     email = "[email protected]" 
     password = "ilovemodals" 
     user = insert(:user, 
        email: email, 
        password_hash: Comeonin.Bcrypt.hashpwsalt(password)) 
     user_params = %{ 
     user: %{ 
      email: user.email, 
      password: password, 
     } 
     } 

     conn = build_conn(:post, "/api/v1/sessions", user_params) 
     response = Router.call(conn, @opts) 
     assert response.status == 201 
    end 

    test "failure" do 
     email = "[email protected]" 
     password = "ilovemodalszzz" 
     user = insert(:user, 
        email: email, 
        password_hash: Comeonin.Bcrypt.hashpwsalt(password)) 
     user_params = %{ 
     user: %{ 
      email: user.email, 
      password: "bad_password", 
     } 
     } 

     conn = build_conn(:post, "/api/v1/sessions", user_params) 
     response = Router.call(conn, @opts) 
     assert response.status == 401 
    end 
    end 

コントローラーのテスト:

defmodule ParrotApi.SessionControllerTest do 
    use ParrotApi.ConnCase 

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

    describe "#create" do 
    test "returns the user when the email and password match", %{conn: conn} do 
     email = "[email protected]" 
     password = "ilovemodals" 
     user = insert(:user, 
        email: email, 
        password_hash: Comeonin.Bcrypt.hashpwsalt(password)) 
     rsvp = insert(:rsvp, user: user) 
     user_params = %{ 
     user: %{ 
      email: email, 
      password: password, 
     } 
     } 
     conn = conn 
      |> post(session_path(conn, :create), user_params) 
     assert json_response(conn, 201)["data"] == %{ 
     "id" => user.id, 
     "email" => user.email, 
     "name" => user.name, 
     "interests" => user.interests, 
     "location" => user.location, 
     "image_url" => user.image_url, 
     "is_admin" => user.is_admin, 
     "rsvps" => [rsvp.meetup_id], 
     } 
    end 


    test "returns an error when the email and password don't match", %{conn: conn} do 
     email = "[email protected]" 
     password = "ilovemodals" 
     insert(:user, 
      email: email, 
      password_hash: Comeonin.Bcrypt.hashpwsalt(password)) 
     user_params = %{ 
     user: %{ 
      email: email, 
      password: "bad_password", 
     } 
     } 
     conn = conn 
      |> post(session_path(conn, :create), user_params) 
     assert json_response(conn, 401) == %{ 
     "message" => "The email and password you entered did not match our records. Please try again." 
     } 
    end 

    test "returns an error when the user doesn't exist", %{conn: conn} do 
     user_params = %{ 
     user: %{ 
      email: "[email protected]", 
      password: "bad_password", 
     } 
     } 
     conn = conn 
      |> post(session_path(conn, :create), user_params) 
     assert json_response(conn, 401) == %{ 
     "message" => "The email and password you entered did not match our records. Please try again." 
     } 
    end 
    end 
end 

答えて

2

あなたの統合テストは、あなたのコントローラのテストが既にカバーしている何かをテストするためには表示されません。しかし、私はあなたがすでにこれを知っていると信じています。

コントローラのテストでカバーしていないものは、Webサーバーのパスです。あなたの統合テストのためにサーバーを有効にして、実際の要求を行うにはHttpPoisonのようなhttpクライアントを使用することをお勧めします。

これらのテストに統合テストとしてタグを付けることをお勧めします。あなたのテストが遅くなっていることがわかったら、デフォルトでそれらを無効にしてください。実際のブラウザの塗りつぶしとクリックを行うExAdmin統合テストにはhoundを使用します。これらのテストは、デフォルトで無効になっています。

# my_app/config/test.exs 
use Mix.Config 
config :my_app, TestMyApp.Endpoint, 
    http: [port: 4001], 
    server: true 

# my_app/test/test_helpers.exs 
ExUnit.configure(exclude: [pending: true, integration: true]) 
ExUnit.start() 

をそしてそれらを実行します:これを行うには

# Run all tests 
mix test --include integration 
# or run only integration 
mix test --only integration