使用FsCheck测试类型列表

时间:2013-12-10 06:28:55

标签: f# fscheck

我有一个测试类型的属性可以成功地往返JSON并返回。

let roundTrip<'a when 'a : equality> (x: 'a) = (toJSON >> ofJSON) x = x

我目前通过调用

运行
Check.Quick roundTrip<TypeName>

我想要的是能够在我通过反射获得的类型列表上运行此属性(扫描我的程序集以查找需要JSON序列化的类型)

是否可以在运行时为列表中的类型运行此属性,而不是需要在我的测试中指定它们?

1 个答案:

答案 0 :(得分:1)

假设您的所有类型都有为其定义的自定义生成器,或者可以由内置生成器派生,您真正需要做的就是为要测试的每种类型实例化往返方法的MethodInfo。然后有一个重载Check.Method,你调用每个类型。这将运行标准的FsCheck测试,就好像你在编译时用类型调用方法一样。

类似的东西:(抱歉,未编译,但应该关闭)

type Marker = class end
let roundtrip<'a> = //as above
let checkForTypes (ts:seq<Type>) =
    let roundtripInfo = typeof<Marker>.DeclaringType.GetMethod("roundtrip")
    ts 
    |> Seq.map (fun t -> roundtripInfo.MakeGenericMethod([|t|])) 
    |> Seq.iter (fun m -> Check.Method(Config.Quick, m))