LoginSignup
11
10

More than 5 years have passed since last update.

[Elixir]マクロでもテストしたい!

Posted at

Goal

ExUnitからのマクロのテスト方法を習得する。

Dev-Environment

OS: Windows8.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

始める前に準備をしましょう!

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しています。

Code.ensure_loaded?/1では、読み込んだモジュールがロードされているか確認しています。
ロードされていれば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が返ってくるはずです。

テストを実行しましょう!

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

もっと難しいマクロのテストをどうするんだ?とかとか色々とまだあるのですが、
最初の足掛かりとしてはこれで良いです。

気が向いたら続きの記事作ります。

Bibliography

Metaprogramming Elixir

11
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10