2017-04-24 9 views
3

与えられたインタフェースには、FSharpスタイルの関数があります。NSubstituteとFSharp - FSharp関数をモックする

type IUseless = 
    abstract member Listify: string -> int -> string list 

どのように機能を模擬しますか?

let substitute = NSubstitute.Substitute.For<IUseless>() 
substitute.Listify.Returns(??? what would even go here ???) 

私は(それはそれが何を表すかのようなものだが)、通常の方法、または関数が含まれている値のようにそれを模擬できることを期待していません。

誰かが正常に.NETのmockingの典型的なライブラリでFSharp関数を嘲笑したのなら、私は不思議です。

答えて

6

まず:はい、あなたは完全に通常の方法のように、これを模擬することができます

let substitute = NSubstitute.Substitute.For<IUseless>() 
(substitute.Listify "abc" 5).Returns ["whatevs"] 

これは動作しますが、F#はカリー化構文にもかかわらず、通常の.NETメソッドのように、この定義をコンパイルしているため。これは、部分的にinterop用と部分的にパフォーマンス用に行われます。

しかし二:私があなただったら、私はむしろ完全に全体NSubstituteビジネスをスキップして、代わりにインラインインターフェイスの実装を使用します。

let substitute = { new IUseless with member x.Listify a b = ["whatevs"] } 

これは、実行時に、クリーナーより良い型検査、およびはるかに高速であります。

+0

インラインインターフェイスの実装(通常は[オブジェクト式](https://fsharpforfunandprofit.com/posts/object-expressions/)と呼ばれています)を使用するための提案に同意しました。一般に、F#コードを書くときには、単体テストを動作させるために通常3ダースのフープにジャンプする必要はありません。モック、スタブ、依存関係注入...あなたが純粋な関数コードを書いているなら、それはすべて方程式を単純化します。 Mark Seemannは、この件に関して、多くの[良いブログ投稿](http://blog.ploeh.dk/tags/#Unit%20Testing-ref)を書いています。 – rmunn

+0

'オブジェクト式 'を使用した場合、インターフェイスのすべてのメンバーを実装する必要はありませんか? –

+0

はい、そうです。それはあなたのインターフェースを小さくしなければならない理由の1つです。オブジェクト指向の人々でさえこのことをお勧めします。 –

関連する問題