Goal
ExUnitからのマクロのテスト方法を習得する。
Dev-Environment
OS: Windows8.1
Erlang: Eshell V7.1, OTP-Version 18.1
Elixir: v1.1.1
Erlang: Eshell V7.1, OTP-Version 18.1
Elixir: v1.1.1
Wait a minute
マクロをはどうやってExUnitでテストしたらいいのでしょうか?
丁度良く、友人から強だゲフンゲフン・・・快くお貸し頂いたMetaprogramming Elixirにある方法を、試してみようと思います。
Index
Macro test with ExUnit
|> Before you start
|> Macro test with ExUnit
|> Before you start
|> Macro test with ExUnit
Before you start
始める前に準備をしましょう!
Example:
>cd path/to/project
>mix new macro_sample
>cd macro_sample
>mix test
よし、ではやっていきましょう!!
Macro test with ExUnit
自作したマクロをExUnitでテストするにはどうすればいいのでしょうか?
結論から言えば、別に難しいことはないです。
難しかったら、誰も使わない気がしますが(笑)
難しかったら、誰も使わない気がしますが(笑)
まずは、テスト用の適当なマクロを作成してしまいましょう。
File: lib/macro_sample.ex
defmodule MacroSample do
defmacro sample(string) do
quote do
unquote(string)
end
end
end
続いてテストコードです。
File: test/macro_sample_test.exs
ExUnit.start
Code.require_file("lib/macro_sample3.ex")
defmodule MacroSampleTest do
use ExUnit.Case
import MacroSample
test "Ensure loaded?" do
assert Code.ensure_loaded?(MacroSample3)
end
end
Code.require_file/2で対象のファイルをrequireしています。
その後、importしています。
その後、importしています。
Code.ensure_loaded?/1では、読み込んだモジュールがロードされているか確認しています。
ロードされていればtrueを返しています。
ロードされていればtrueを返しています。
テストを実行してみましょう。
Example:
>mix test
.
Finished in 0.09 seconds (0.08s on load, 0.01s on tests)
1 test, 0 failures
Randomized with seed 738000
最初のテストはパスしました。
それでは、本題のマクロをテストコードで使ってみましょう。
といっても、既に読み込みもできているのが確認できているので、後は普通の関数と変わりませんね。
といっても、既に読み込みもできているのが確認できているので、後は普通の関数と変わりませんね。
テストコードを追加します。
File: test/macro_sample_test.exs
...
defmodule MacroSampleTest do
...
test "Macro test sample" do
assert MacroSample.sample("hoge") == "hoge"
end
end
テスト用に作ったマクロは、渡した引数をそのままunquoteしているだけです。
なので文字列:hogeを渡したら、文字列:hogeが返ってくるはずです。
なので文字列:hogeを渡したら、文字列:hogeが返ってくるはずです。
テストを実行しましょう!
Example:
>mix test
..
Finished in 0.07 seconds (0.07s on load, 0.00s on tests)
2 tests, 0 failures
Randomized with seed 622000
テストが通過しました。
Speaking to oneself
もっと難しいマクロのテストをどうするんだ?とかとか色々とまだあるのですが、
最初の足掛かりとしてはこれで良いです。
最初の足掛かりとしてはこれで良いです。
気が向いたら続きの記事作ります。