Help us understand the problem. What is going on with this article?

Elixir で private な関数をテストする

More than 1 year has passed since last update.

私は private な関数もテストしたい派なので、defp で定義した関数をテストしたくなることがよくあります。

defp で定義した関数をテストする方法は、調べてみるとすぐに見つかります。

に書いてあるように、@compile 属性に :export_all を指定するだけです。

defmodule Foo do
  @compile if Mix.env == :test, do: :export_all

  defp f() do
    ...
  end
end

これで defp の関数も含めて全て export されるようになります。

ただし、これをすると以下の警告が出ます。

warning: export_all flag enabled - all functions will be exported
  lib/my_app/my_app.ex:1

:export_all が指定されていると警告が出るようです。
この警告は、特に :warnings_as_errors オプションを有効にしてると、ずっとコンパイルが通らなくなってしまいます。1

何か良い方法が無いかということで、そもそも @compile には何を指定できるかというのを調べると、Module のドキュメントに Compile options という項目がありました。
それによると :debug_info:inline が指定できるらしいですが、更に Erlang の数々のコンパイルオプションも指定できるようです。

それをよく眺めてみると :nowarn_export_all というフラグがありました。
これを使って、以下のように書くことで :export_all の警告が消せます。

defmodule Foo do
  if Mix.env == :test do
    @compile :export_all
    @compile :nowarn_export_all
  end

  defp f() do
    ...
  end
end

これで無事 private な関数がテストできるようになりました。
private な関数をテストする派の人はそこそこ居ると思うので、必要であればこのように書くといいでしょう。


  1. :warnings_as_errors は警告をエラーとして報告する機能で、多人数で真面目なプロダクトを作るなら必ず付けておくべきオプションです。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした