2

The following test fails:

open FsCheck
open FsCheck.NUnit
open NUnit.Framework

let ``Property: double negation equals no negation`` list =
    list = List.rev (List.rev list)

[<Test>]
let ``reversing list two times is equal to not reversing list at all`` list = 
    Check.Quick ``Property: double negation equals no negation``

Error:

Message: No arguments were provided

I thought FsCheck would provide the argument for me on each test iteration.

I am referencing the following documentation.

4

2 回答 2

5

这是一个适用于 xUnit.net 的版本:

open FsCheck
open Xunit

let ``Property: double negation equals no negation`` list =
    list = List.rev (List.rev list)

[<Fact>]
let ``reversing list two times is equal to not reversing list at all`` () = 
    Check.Quick ``Property: double negation equals no negation``

当你以这种方式使用它时,第一个函数是属性,它可以接受参数。

-annotated[<Fact>]函数不接受任何参数。

这种方法的问题是,Check.Quick如果属性不成立,不会导致测试失败。它仅输出该属性被伪造。如果您希望在属性被伪造的情况下测试失败,您应该使用Check.QuickThrowOnFailure

open FsCheck
open Xunit

let ``Property: double negation equals no negation`` list =
    list = List.rev (List.rev list)

[<Fact>]
let ``reversing list two times is equal to not reversing list at all`` () = 
    Check.QuickThrowOnFailure ``Property: double negation equals no negation``

另一个问题是没有理由以如此冗长的方式编写此代码。这是编写相同属性的更紧凑的方法:

open FsCheck
open Xunit

[<Fact>]
let ``reversing list two times is equal to not reversing list at all`` () = 
    Check.QuickThrowOnFailure <| fun (l : int list) ->
        l = List.rev (List.rev l)
于 2016-03-21T14:34:09.790 回答
1

马克的回答很好,但只是为了澄清 NUnit 的情况。

FsCheck.NUnit 提供了PropertyAttribute带有参数的装饰测试方法。它不会挂接到正常的 NUnitTestAttribute中。所以换句话说,你的例子有一个正常的 NUnit 测试,它需要一个参数——NUnit 无法处理这个问题。采用您希望 FsCheck 为其生成值的参数的测试如下所示:

[<Property>]
let ``Property: double negation equals no negation`` list =
    list = List.rev (List.rev list)

另一种选择 - 如果你不想与 NUnit 和 FsCheck.NUnit 搏斗,正如 Mark 所说,它可能非常脆弱,主要是由于 NUnit 2 的插件模型非常烦人 - 根本不使用 FsCheck.NUnit,而是使用正常的 NUnit 测试。用于QuickCheckThrowOnFailure通过异常将测试失败从 F​​sCheck 发送到 NUnit:

[<Test>]
let ``reversing list two times is equal to not reversing list at all`` () = 
    Check.QuickThrowOnFailure ``Property: double negation equals no negation``

您的示例以某种方式混合了这两个选项。

于 2016-03-22T08:51:53.760 回答