首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在基于属性的测试中我会收到一个“没有提供参数”的错误?

为什么在基于属性的测试中我会收到一个“没有提供参数”的错误?
EN

Stack Overflow用户
提问于 2016-03-21 14:21:56
回答 2查看 1.5K关注 0票数 2

以下测试失败:

代码语言:javascript
复制
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``

错误:

消息:没有提供任何参数

我认为FsCheck会在每次测试迭代中为我提供论据。

我引用以下文档

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-21 14:34:09

下面是xUnit.net的一个类似的版本:

代码语言:javascript
复制
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``

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

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

这种方法的问题是,如果属性不保存,Check.Quick不会导致测试失败。它只输出该财产被篡改的结果。如果您希望在该属性被篡改时测试失败,则应使用Check.QuickThrowOnFailure

代码语言:javascript
复制
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``

另一个问题是,没有理由用这样冗长的方式写这篇文章。下面是一种更紧凑的编写相同属性的方法:

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2016-03-22 08:51:53

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

FsCheck.NUnit提供了使用参数的PropertyAttribute来修饰测试方法。它不与普通的NUnit TestAttribute挂钩。换句话说,您的示例有一个采用参数的普通NUnit测试-- NUnit无法处理这个问题。使用您希望FsCheck生成值的参数的测试如下所示:

代码语言:javascript
复制
[<Property>]
let ``Property: double negation equals no negation`` list =
    list = List.rev (List.rev list)

另一个选择--如果你不想和NUnit和FsCheck.NUnit搏斗,就像马克说的那样,它可能很脆弱,主要是因为NUnit 2非常烦人的插件模型--那就是根本不使用FsCheck.NUnit,而是使用普通的NUnit测试。使用QuickCheckThrowOnFailure通过异常从FsCheck到NUnit发出测试失败信号:

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

你的例子在某种程度上混合了这两个选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36133559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档