6

私は単体テストには不慣れです。Nuget からインストールFsCheck.NunitNUnitTestAdapterて、プロパティ ベースのテストを行おうとしています。これは、計り知れない Scott Wlaschinに大きく影響されています。

属性を使用してい[<Property>]ますが、テストの要件を満たさない入力を「スキップ」する機能が必要です。

[<Property(MaxTest=10)>]
let ``Calling unzipTo with an invalid destination will yield a failure.`` badDest =
    if Directory.Exists(badDest)
    then // somehow skip to the next randomized input
    else // do the actual test

これを行う最も簡単な方法は何ですか?

存在する場合は FsCheck/NUnit の回答を希望しますが、Visual Studio でテストを実行できる他のフレームワークも検討します。(これを正確に行うための単純な関数があるフレームワークを見たと思いましたが、それが何であるかわかりません。)

FsCheck.NUnit は、F# 型 (判別共用体など) のランダムな入力を追加作業なしで生成できるため、これまでのところ好んで使用しています。

4

3 に答える 3

6

次のようなことができるはずです。

open FsCheck
open FsCheck.Xunit

[<Property(MaxTest=10)>]
let ``Calling unzipTo with an invalid destination will yield a failure.`` badDest =
    (not Directory.Exists(badDest)) ==> lazy
    // do the actual test

最初の行はブール条件で、モジュール==>によって定義されたカスタム オペレータです。FsCheck右側の条件が に評価された場合にのみ、遅延式の評価を強制しtrueます。

ただし、ファイル システムに依存しないように、このテストをリファクタリングすることを検討してください。ファイル システムは永続的であるため、Persistent Fixture が自動的に作成されますが、これは管理が大変です。対処することは不可能ではありませんが、避けたほうがよいでしょう。

この例ではFsCheck.Xunitを使用していますが、IIRC FsCheck.Nunitも同じように機能します。ただし、 FsCheck.Nunitの代わりにFsCheck.Xunitを使用することを真剣に検討する必要があります。NUnit 2 の拡張性モデルは非常に貧弱です。つまり、NUnit を拡張しようとするほとんどの Glue ライブラリには多くの問題が伴います。これはFsCheck.Nunitの問題ではなく、 NUnit 自体の問題ですが、多くの問題が発生します。

于 2016-01-07T15:07:35.257 に答える
0

私は F# や fscheck にあまり詳しくありませんが、NUnit にはAssert.Ignore()、テストをすぐに停止して「無視」とマークする機能が用意されています。または、それらがより適切なステータスであると感じた場合はAssert.Inconclusive()、またはを使用することもできます。Assert.Pass()

于 2016-01-07T14:02:07.920 に答える