2017-04-12 1 views
2

私は関数の戻り値をテストしています。どちらが好ましい方法ですか?テストを実行すると、より説明的であるとき、私は今、テストはassert文およびエラー・メッセージを必要としないため、 アサート/反論なしのExUnit、パターンマッチングのみに依存していますか?

test "extra verbose, using assert" do 
    {:error, reason} = MyModule.my_fun 
    assert reason == :nope 
end 

test "using pattern matching only" do 
    {:error, :nope} = MyModule.my_fun 
end 

は、私が最初のものが好きです。 Otoh、 MatchErrorの行番号でも十分です。

答えて

6

あなたがassert、より詳細なエラーメッセージの両方を取得するために=assertを使用することができ、およびコードは1行だけで:==

assert {:error, :nope} = MyModule.my_fun 

とは異なり、あなたはLHS上の任意のパターンを使用することができ、この場合、===に置き換えることができます。これは、LHSが有効なパターンと値の両方であるためです。

エラーが発生した場合、assertを含まないパターンマッチング以外のエラーメッセージが表示されます。本当に= MyModule.my_fun`テスト{いいえ:エラー、}私にとって

1) test the truth (MTest) 
    test/m_test.exs:10 
    match (=) failed 
    code: {:error, :nope} = MyModule.my_fun() 
    right: {:error, :nop} 
    stacktrace: 
     test/m_test.exs:11: (test) 
+0

試合に主張使用する主な欠点は、あなたがテスト中に右の比較は – Stuart

+0

結果対左取得することはできませんされてはアサート 'です何か?パターンが一致すると、基本的にタプル '{:error、:nope}'が真実であると主張します。パターンが一致しない場合、まだ 'MatchError'があります。 – carp

+1

@carp nopeでは、「MatchError」はありません。 'assert'は' = '特別に扱います。私はちょうど今の答えにサンプルのテスト失敗の出力を追加しました。 – Dogbert

関連する問題