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