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