我是单元测试的n00b.我已经安装FsCheck.Nunit
,并NUnitTestAdapter
从的NuGet,我试图做基于属性的测试,主要是由灵感不可估量的斯科特Wlaschin.
我正在使用该[
属性,我希望能够"跳过"不符合测试要求的输入:
[] 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#类型(有区别的联合等)生成随机输入而无需额外的工作.
你应该可以做这样的事情:
open FsCheck open FsCheck.Xunit [] let ``Calling unzipTo with an invalid destination will yield a failure.`` badDest = (not Directory.Exists(badDest)) ==> lazy // do the actual test
第一行是布尔条件,==>
是FsCheck
模块定义的自定义运算符.如果右侧的条件评估为,则仅强制评估惰性表达式true
.
但是,请考虑重构此测试,以使其不依赖于文件系统.文件系统是持久的,因此自动创建持久性夹具,管理起来很麻烦 ; 并非不可能处理,但最好避免.
此示例使用FsCheck.Xunit,但IIRC FsCheck.Nunit以相同的方式工作.但是,您应该认真考虑使用FsCheck.Xunit而不是FsCheck.Nunit.NUnit 2的可扩展性模型非常差,这意味着大多数试图扩展NUnit的Glue Libraries都会遇到很多问题.这对于FsCheck.Nunit来说不是问题,但是对于NUnit本身来说,但它会给你带来很多麻烦.