1

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

type Quote = {a:string}

mock<Quote>

这抛出

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

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

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

1 回答 1

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

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

于 2012-05-08T21:23:48.537 回答