在F#中记录一条记录

时间:2012-05-08 21:14:55

标签: f# nsubstitute

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

type Quote = {a:string}

mock<Quote>

这会抛出

  

System.TypeLoadException:无法加载类型   程序集'DynamicProxyGenAssembly2中的'Castle.Proxies.QuoteProxy',   Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'因为   父类型是密封的。

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

let mock<'typee when ^typee : not struct> = Substitute.For<'typee>()

1 个答案:

答案 0 :(得分: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

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