2012-05-07 20 views
1

私はPyHamcrestを使用していますが、この質問は言語に依存しないと思います。ハムクレストで複数のassert_thatを組み合わせるには?

Iターンしたいと思います:

assert_that(actual0, matcher0) 
assert_that(actual1, matcher1) 

ように単一のassertに両方のアサーションが失敗した場合、エラーメッセージはそう言います。これはHamcrest(または他のパッケージ/モジュール)で行うことができますか? Pythonで

、私が実装しました:

def assert_all(*assertions): 
    assertion_failed = False 
    assertion_message = [] 

    for (actual, matcher) in assertions: 
     try: 
      hamcrest.assert_that(actual, matcher) 
     except AssertionError as e: 
      assertion_failed = True 

      assertion_message.append(e.message) 

    if assertion_failed: 
     raise AssertionError(''.join(assertion_message)) 

をので、私のテストを呼び出します。

assert_all(
    (actual0, matcher0), 
    (actual1, matcher1)) 
をしかし、このようなものの実装は既にあります場合、私は思ったんだけど。

actual

答えて

1

値とcontainsにパラメータとしてマッチャー同じ数の値(リストまたはタプル)の配列を渡し:

assert_that((actual0, actual1, ...), contains(matcher0, matcher1, ...)) 

照合プログラムのリストは実際の値のシーケンスに順番に適用されます、 一つずつ。アサーションが合格するには、すべて一致している必要があります。

+0

両方のアサーションが失敗した場合は、最初のアサーションのみが報告されます。 –

+0

通常、実際の値はメソッドとして既にシーケンスとして返されます。あなたの例のように、アサーションを2つの別々の値に組み合わせたいのはなぜか分かりませんが、具体的な例がよりよく説明できます。 Hamcrestのmatcherは、mockingメソッドなどの主張以上に使用されていることに注意してください。 –

+0

プロジェクトでチケットを開封できますか? –

0

ハムクレストアサーションは、単一のオブジェクトのマッチャであることを意図しているため、モデルにエレガントにフィットすることは難しいです。一般的に、私はあなたが一緒にクルージングする解決策は、別々のアサーションと同じくらい悪く見えるだろうと思います。私の考えでは、分かりやすくするために別のアサーションが好きです。

関連する問題