【发布时间】:2017-04-17 19:09:24
【问题描述】:
我有一个控制器:
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用于在用户未登录时进行重定向等。然后在我的视图测试中,我确保加载并显示某些内容。 -
你愿意举个例子吗?