f#中的参数化测试-这不是有效的常量表达式

f#中的参数化测试-这不是有效的常量表达式,f#,custom-attributes,constant-expression,fsunit,parameterized-tests,F#,Custom Attributes,Constant Expression,Fsunit,Parameterized Tests,由于某种原因,当通过TestCaseattrubute向测试传递参数时,我得到了关于第一个参数的以下错误消息,在本例中,第一个参数是一个数组: 这不是有效的常量表达式或自定义属性值 模块游戏逻辑测试= 开放式FSU 打开NUnit.Framework 开放游戏逻辑 //这不是有效的常量表达式或自定义属性值 [] 让``举个例子。``(a,m,h,c)= A. |>1米 |>应等于(h,c) 但是,当从属性和方法本身删除最后一个参数时,一切都正常 [<TestCase( [| 1; 2;

由于某种原因,当通过
TestCase
attrubute向测试传递参数时,我得到了关于第一个参数的以下错误消息,在本例中,第一个参数是一个数组:

这不是有效的常量表达式或自定义属性值

模块游戏逻辑测试=
开放式FSU
打开NUnit.Framework
开放游戏逻辑
//这不是有效的常量表达式或自定义属性值
[]
让``举个例子。``(a,m,h,c)=
A.
|>1米
|>应等于(h,c)
但是,当从属性和方法本身删除最后一个参数时,一切都正常

[<TestCase( [| 1; 2; 3 |], 3, 1)>]
let ``let example.`` (a, m, h) = 
    a
    |> proof1 m
    |> should equal (h,1)
[]
让``举个例子。``(a,m,h)=
A.
|>1米
|>应等于(h,1)

我做错了什么?我最好也定义一个元组
int*int
,但它似乎也不起作用。

CLI对属性参数的类型有一个限制:

  • 原语:布尔、整型、浮点等
  • 列举
  • 类型引用:System.type
  • “kinda对象”:上面类型的装箱(如果需要)表示
  • 上述类型之一的一维数组(即不允许嵌套数组)
因此,我们可以得出这样的结论:不能将tuple用作属性参数的类型

从这里开始我的推测,所以下面的任何一个都不可能是真的

我使用了一些不同的属性,发现当属性具有可变数量的参数(params)时,F#编译器开始抱怨一个each数组参数。例如,如果我定义以下属性

public class ParamsAttribute : Attribute
{
    public ParamsAttribute(params object[] parameters)
    {}
}
如果尝试从F#代码中使用它,我会得到一个错误:

[<Params(1, 2, 3)>] // here everything is OK
let x () = ()

[<Params([|1; 2; 3|])>] // the same error as you have
let y () = ()
[]//这里一切正常
设x()=()
[]//与您的错误相同
让y()=()

我猜想编译器可以将PARAMS参数看作数组,因此不允许在其中定义“嵌套”数组。但正如我所说,这纯粹是猜测。

使用字符串参数代替数组参数。将所有术语连接到字符串中并传入。 使用String.Split将字符串参数转换为字符串数组 然后使用
Array.map
转换为所选的数组

[<TestCase([|1, 2, 3|], 4, 5, 6)>]
let ``My Test``(param1: int[], param2: int, param3: int, param4: int) =
    // My test code
[]
设为“我的测试”(param1:int[],param2:int,param3:int,param4:int)=
//我的测试代码
变成

[<TestCase("1|2|3", 4, 5, 6)>]
let ``My Test``(param1: string, param2: int, param3: int, param4: int) =
    let stringArray = param1.Split('|', SplitStringOptions.None)
    let intArray = Array.map int stringArray

    // My test code
[]
让``My Test``(param1:string,param2:int,param3:int,param4:int)=
设stringArray=param1.Split(“|”,SplitStringOptions.None)
设intArray=Array.map int stringArray
//我的测试代码

我只是在不同的上下文中查看相同的错误消息(使用FSharp.Data JsonProvider)。我必须在我创建的绑定(即
[]
)上方添加一个特殊的指示符。老实说,我不太确定这是怎么回事,但也许这也适用于这里?
[<TestCase("1|2|3", 4, 5, 6)>]
let ``My Test``(param1: string, param2: int, param3: int, param4: int) =
    let stringArray = param1.Split('|', SplitStringOptions.None)
    let intArray = Array.map int stringArray

    // My test code