Goal
- 自作のユニットテスト用パッケージ(kinotake)をPhoenixで使う
- 2016年度の夏コミ用の内容を一部公開
Dev-Environment
OS: Windows8.1
Erlang/OTP: v19.0 (EShell v8)
Elixir: v1.3.0
Phoenix: v1.2
Erlang/OTP: v19.0 (EShell v8)
Elixir: v1.3.0
Phoenix: v1.2
Context
夏コミ用に執筆している本の一部を先行して公開します。
公開している内容は、自作パッケージをPhoenixで使っている例になります。
問題があったら消すかもしれません。購入の参考になったら幸いです。
公開している内容は、自作パッケージをPhoenixで使っている例になります。
問題があったら消すかもしれません。購入の参考になったら幸いです。
- プロジェクトの作成
まずはプロジェクトを作成し、サーバの起動までを確認します。
Example:
> cd path/to/project
> mix phoenix.new example
...
> mix ecto.create
...
> mix phoenix.server
...
Ctrl+C
サーバを起動しhttp://localhost:4000へアクセスします。
Phoenixのウェルカムページが表示されていれば問題ありません。
Phoenixのウェルカムページが表示されていれば問題ありません。
- Userモデルの作成
せっかくなのでユーザモデルなどを作成し、少し遊びます。
Example:
> mix phoenix.gen.html User users name:string email:string
...
ユーザ用のルーティングを追加します。
File: web/router.ex
defmodule KinotakeExampleInPhoenix.Router do
...
scope "/", KinotakeExampleInPhoenix do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
resources "/users", UserController
end
...
end
マイグレーションを実行し、DBへ反映します。
Example:
> mix ecto.migrate
...
- パッケージの追加
パッケージを利用するため、mix.exsファイルを変更します。
depsへの追加とアプリケーション起動時に立ち上げるためにapplicationsへも追加します。
depsへの追加とアプリケーション起動時に立ち上げるためにapplicationsへも追加します。
File: mix.exs
defmodule KinotakeExampleInPhoenix.Mixfile do
...
def application do
[mod: {KinotakeExampleInPhoenix, []},
applications: [:phoenix,
:phoenix_pubsub,
:phoenix_html,
:cowboy,
:logger,
:gettext,
:phoenix_ecto,
:postgrex,
:kinotake]] ## Add
end
...
defp deps do
[{:phoenix, "~> 1.2.0"},
{:phoenix_pubsub, "~> 1.0"},
{:phoenix_ecto, "~> 3.0"},
{:postgrex, ">= 0.0.0"},
{:phoenix_html, "~> 2.6"},
{:phoenix_live_reload, "~> 1.0", only: :dev},
{:gettext, "~> 0.11"},
{:cowboy, "~> 1.0"},
{:kinotake, github: "darui00kara/kinotake", branch: "master"}] ## Add
end
...
end
パッケージを取得します。
Example:
> mix deps.get
...
- ユニット用のモジュールを作成
ユニットテスト用のモジュールを作成します。
実行条件は、ユーザのidが1であるときに実行するように設定しています。
実行内容は、表示するユーザの名前を変更するだけです。
実行条件は、ユーザのidが1であるときに実行するように設定しています。
実行内容は、表示するユーザの名前を変更するだけです。
File: lib/user_unit.ex
defmodule UserUnit do
use KinoTake.Unit
active_if [user: user] do
user.id == 1
end
function(:show, [user: user]) do
Map.put(user, :name, "unit")
end
end
- invokeしてみる
UserControllerのshowアクションへ組み込みます。
use(Invokerモジュール)を追加、invoke処理の追加をしています。
use(Invokerモジュール)を追加、invoke処理の追加をしています。
File: web/controllers/user_controller.ex
defmodule KinotakeExampleInPhoenix.UserController do
use KinotakeExampleInPhoenix.Web, :controller
use KinoTake.Invoker
...
def show(conn, %{"id" => id}) do
user = Repo.get!(User, id)
user = invoke(UserUnit, :show, [locals: [user: user]]) do
Map.put(user, :name, "default")
end
render(conn, "show.html", user: user)
end
...
end
ようやっと実行です。サーバを起動しましょう。
Example:
> mix phoenix.server
...
ユーザを追加する機能も準備の段階で作成されていますので、
ユーザに関しては適当に追加してください。2人ほど追加すれば十分です。
ユーザに関しては適当に追加してください。2人ほど追加すれば十分です。
作成したら、ユニットが動作するid:1のユーザを参照してみます。
ユーザの名前がunitに変わっています。
ユーザの名前がunitに変わっています。
次に、ユニットが動作しないid:2のユーザを参照してみます。
ユーザの名前がdefaultに変わっています。
ユーザの名前がdefaultに変わっています。
どうやらちゃんと処理が分けられているようです。やったね!
Bibliography
なし