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 に答える