1

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

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

我目前通过调用运行

Check.Quick roundTrip<TypeName>

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

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

4

1 回答 1

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))
于 2013-12-11T23:07:20.133 回答