我有一个测试类型的属性可以成功地往返到 JSON 并返回。
let roundTrip<'a when 'a : equality> (x: 'a) = (toJSON >> ofJSON) x = x
我目前通过调用运行
Check.Quick roundTrip<TypeName>
我想要的是能够在我通过反射获得的类型列表上运行此属性(扫描我的程序集以查找我知道需要 JSON 可序列化的类型)
是否可以在运行时为列表中的类型运行此属性,而不是需要在我的测试中全部指定它们?
假设您的所有类型都为它们定义了自定义生成器,或者可以由内置生成器派生,那么您真正需要做的就是为要测试的每种类型实例化往返方法的 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))