我有一個控制器:Phoenix:控制器測試與視圖測試?
defmodule ParrotApi.MeetupController do
use ParrotApi.Web, :controller
alias ParrotApi.Meetup
def index(conn, _params) do
one_hour_ago = Timex.now
|> Timex.shift(hours: -1)
|> Timex.to_unix
meetups = from(m in Meetup, where: m.timestamp >= ^one_hour_ago)
|> Repo.all
|> Repo.preload(:topic)
render conn, meetups: meetups
end
end
與此控制器一個觀點:
defmodule ParrotApi.MeetupView do
use ParrotApi.Web, :view
def render("index.json", %{ meetups: meetups }) do
render_many(meetups, ParrotApi.MeetupView, "meetup.json")
end
def render("meetup.json", %{ meetup: meetup }) do
%{
id: meetup.id,
timestamp: meetup.timestamp,
topic: meetup.topic.title,
}
end
end
我在寫我的第一個控制器測試:
defmodule ParrotApi.MeetupControllerTest do
use ParrotApi.ConnCase
alias ParrotApi.Meetup
alias ParrotApi.Topic
alias ParrotApi.Repo
require Logger
describe "#index" do
test "returns future meetups" do
topic_title = "Is Jesus your savior?"
future_time = Timex.now
|> Timex.shift(minutes: 1)
|> Timex.to_unix
{:ok, topic} = Topic.changeset(%Topic{}, %{title: topic_title}) |> Repo.insert
{:ok, meetup} = Meetup.changeset(%Meetup{}, %{timestamp: future_time, topic_id: topic.id}) |> Repo.insert
conn = build_conn()
conn = get conn, meetup_path(conn, :index)
assert json_response(conn, 200) == [
%{
"id" => meetup.id,
"timestamp" => future_time,
"topic" => topic_title,
}
]
end
它傳遞。但是......這對我來說是一種視圖測試嗎?它正在測試視圖所操縱的裝飾/呈現響應。所以我不知道該如何做我的視圖測試。
有沒有辦法只測試了render conn, meetups: meetups
響應,然後在我的控制器測試目前提取的東西到視圖測試?或者這是測試事情的錯誤方法?
這可能是相當主觀的,但是當我做控制器的測試中,我大多隻是確保我得到我期待的迴應。例如當我期望頁面加載時的'200'狀態代碼,'302'用於當用戶未登錄時的重定向等。然後在我的視圖測試中,我確保某些內容被加載和顯示。 –
你願意展示一個例子嗎? – Edmund