在F#中记录一条记录

Pau*_*icz 1 f# nsubstitute

由于F#记录确实是密封类,我不能存根记录类型.是否有一个属性我可以放在F#中的记录,以便它不被编译为密封,以便我可以存根记录?

type Quote = {a:string}

mock<Quote>
Run Code Online (Sandbox Code Playgroud)

这个抛出

System.TypeLoadException:无法从程序集"DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null"加载类型"Castle.Proxies.QuoteProxy",因为父类型已被密封.

如果你很好奇.这是mock的定义:

let mock<'typee when ^typee : not struct> = Substitute.For<'typee>()
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 8

我认为没有办法告诉F#编译器将F#记录生成为非密封类.

但问题是,为什么要存根记录呢?我的理解是存根用于模仿某种类型的某些功能.但是F#记录是由编译器生成的,所以如果您信任F#编译器,则不需要模拟它们,因为它们总是可以预测.

如果你想在记录中添加一些成员,那么你可以嘲笑这些.为此,您可以定义接口,在记录类型中实现它并为接口生成存根:

type IFoo = 
  abstract Foo : int -> int

type Bar = 
  { Number : int }
  interface IFoo with
    member x.Foo(n) = n + x.Number
Run Code Online (Sandbox Code Playgroud)

通常,只需检查操作是否为指定的输入提供正确的结果,就可以测试以函数式编写的代码.不太需要测试内部实现是否调用其他操作(即使用存根).当然,这可能并不总是适用于您与其他组件互操作的真实场景......