0
我有用于登录用户的端点。我编写了集成测试和控制器测试,但它们看起来非常相似,除了我在控制器测试中测试了更多的边缘案例(例如,用户尝试使用不正确的电子邮件登录)。测试的内容似乎并没有什么不同,所以如果有人能够阐明他们应该如何改变,那将是非常好的。Phoenix:API集成测试vs控制器测试
集成测试:
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