我有一个测试类型的属性可以成功地往返JSON并返回。
let roundTrip<'a when 'a : equality> (x: 'a) = (toJSON >> ofJSON) x = x
我目前通过调用
运行Check.Quick roundTrip<TypeName>
我想要的是能够在我通过反射获得的类型列表上运行此属性(扫描我的程序集以查找需要JSON序列化的类型)
是否可以在运行时为列表中的类型运行此属性,而不是需要在我的测试中指定它们?
答案 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))