スポンサーリンク

2016年7月8日

[Elixir]夏コミ用の内容を一部公開

Goal

  • 自作のユニットテスト用パッケージ(kinotake)をPhoenixで使う
  • 2016年度の夏コミ用の内容を一部公開

Dev-Environment

OS: Windows8.1
Erlang/OTP: v19.0 (EShell v8)
Elixir: v1.3.0
Phoenix: v1.2

Context

夏コミ用に執筆している本の一部を先行して公開します。
公開している内容は、自作パッケージをPhoenixで使っている例になります。
問題があったら消すかもしれません。購入の参考になったら幸いです。
今回は100ページいかないかもしれません・・・(残念)
  • プロジェクトの作成
まずはプロジェクトを作成し、サーバの起動までを確認します。

Example:

> cd path/to/project

> mix phoenix.new example
...

> mix ecto.create
...

> mix phoenix.server
...

Ctrl+C
サーバを起動しhttp://localhost:4000へアクセスします。
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へも追加します。

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であるときに実行するように設定しています。
実行内容は、表示するユーザの名前を変更するだけです。

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処理の追加をしています。

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人ほど追加すれば十分です。
作成したら、ユニットが動作するid:1のユーザを参照してみます。
ユーザの名前がunitに変わっています。
次に、ユニットが動作しないid:2のユーザを参照してみます。
ユーザの名前がdefaultに変わっています。
どうやらちゃんと処理が分けられているようです。やったね!

Bibliography

なし

人気の投稿