私のoverflower_supportクレートのテストでは、私はすでにstd::panic::catch_unwind(_)
を使って処理されているパニックの偽の報告がたくさんあることがわかりました。これは起こり得る実際のエラーをあいまいにするので、少し不幸です。メッセージは次のようになります。これらの気が散るのメッセージを鎮めるためにQuickCheckテストでパニックを静かにキャッチする方法はありますか?
thread 'safe' panicked at 'arithmetic overflow', src/lib.rs:56
、私はパニックハンドラをハイジャックdont_panic(..)
機能を導入し、閉鎖を呼び出し、閉鎖の結果を返す、行われたときにパニックハンドラをリセットします。それは次のようになります。
fn dont_panic<F, A, R>(args: A, f: F) -> R
where F: Fn(A) -> R
{
let p = panic::take_hook();
panic::set_hook(Box::new(|_|()));
let result = f(args);
panic::set_hook(p);
result
}
しかし、やや意外に希望のメッセージをquells、だけでなく、私には明らかに価値があるquickcheckのエラー出力だけでなく、をチェックする関数内で、この関数を使用して。これは、テストを1つのスレッドに限定している場合でも発生します。
#[test]
fn test_some_panic() {
fn check(x: usize) -> bool {
let expected = if x < 256 { Some(x) } else { None };
let actual = dont_panic(|| panic::catch_unwind(|| { assert!(x < 256); x }).ok());
expected == actual
}
quickcheck(check as fn(usize) -> bool);
}
どのように見えるQuickCheckのパニックを維持しながら、私は自分のコードからキャッチパニックを隠すことができますか?
あなたは、コードの再現性の例が含まれてもらえますか? 'dont_panic'に' quickcheck :: quickcheck'をラップしているなら、 'quickcheck'の契約が失敗したときにパニックに陥るので、あなたのハンドラがエラーメッセージを押しつぶしていることに意味があります。おそらく、あなたは「QuickCheck.quicktest」からより多くの走行距離を得るかもしれません。これは、パンチングの代わりに「結果」を返します。 – BurntSushi5
'font check((usize、usize)) - > bool'関数内の' dont_panic(..) 'に' panic :: catch_unwind(_) '呼び出しをラップしています。これは' quickcheck :: quickcheck ' – llogiq
ほとんどの完全な例を追加しました(' std :: panic;を使うと実行する必要があります)。 – llogiq