由于某种原因,当通过TestCase
attrubute将参数传递给测试时,我收到有关第一个参数的以下错误消息,在本例中是一个数组:
这不是有效的常量表达式或自定义属性值
module GameLogicTest =
open FsUnit
open NUnit.Framework
open GameLogic.Examle
// This is not a valid constant expression or custom attribute value
[<TestCase( [| 1; 2; 3 |], 3, 1,1)>]
let ``let example.`` (a, m, h, c) =
a
|> proof1 m
|> should equal (h,c)
但是当从属性和方法本身中删除最后一个参数时,一切正常。
[<TestCase( [| 1; 2; 3 |], 3, 1)>]
let ``let example.`` (a, m, h) =
a
|> proof1 m
|> should equal (h,1)
我做错了什么?我最好定义一个int * int
的元组,但它似乎也不起作用。
答案 0 :(得分:5)
CLI对属性参数的种类有限制:
因此,我们可以断定你不能使用元组作为属性参数的类型。
从这里开始我的推测,所以以下都不是真的。
我玩了一些不同的属性,发现当属性具有可变数量的参数(params)时,F#编译器开始抱怨每个数组参数。例如,如果我定义以下属性
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 () = ()
我猜编译器可以将params参数视为一个数组,因此不允许定义嵌套&#39;数组在里面。但正如我所说,这是一种纯粹的猜测。
答案 1 :(得分:1)
使用字符串参数代替数组参数。将所有术语连接到字符串中并传入。
使用String.Split将字符串参数转换为字符串数组
然后使用copy "$(ProjectDir)FolderName\*" "PathYouWantYourFilesCopiedTo"
转换为选择的数组。
Array.map
变为
[<TestCase([|1, 2, 3|], 4, 5, 6)>]
let ``My Test``(param1: int[], param2: int, param3: int, param4: int) =
// My test code