3

私は FakeItEasy を使用するのが初めてで、最初の試みで立ち往生しています。偽造したいインターフェースには、次のようなメソッドがあります。

byte[] ReadFileChunk(string path,int offset,int count,out long size);

引数がどのように渡されるかを確認したいので、ReturnsLazily を使用しています。これが私の試みです:

long resSize;
A.CallTo(() => dataAttributesController
     .ReadFileChunk(A<string>.Ignored, A<int>.Ignored, A<int>.Ignored, out resSize))
     .ReturnsLazily((string path, int offset, int count) =>
        {
             return Encoding.UTF8.GetBytes("You requested: " + path + "(" + offset + "," + count + ")");
        })
    .AssignsOutAndRefParameters(123);

これはコンパイルされますが、実行すると次の例外が生成されます。

The faked method has the signature (System.String, System.Int32, System.Int32, System.Int64&), but returns lazily was used with (System.String, System.Int32, System.Int32).

どちらが正しいのですが、out パラメータを追加する方法がわかりません。ReturnLazily 部分を次のように変更すると:

.ReturnsLazily((string path, int offset, int count, out long size) =>
   {
      size = 0;
      return Encoding.UTF8.GetBytes("You requested: " + path + "(" + offset + "," + count + ")");
   })

コンパイルされず、エラーがわかりません:

error CS1593: Delegate 'System.Func<FakeItEasy.Core.IFakeObjectCall,byte[]>' does not take 4 arguments
error CS1661: Cannot convert lambda expression to delegate type 'System.Func<string,int,int,long,byte[]>' because the parameter types do not match the delegate parameter types
error CS1677: Parameter 4 should not be declared with the 'out' keyword

私のような初心者にとって、これは 4 つのパラメーターが好きではなく、「out」をどうするかを理解していないように見えます。誰かがこれらのエラーをどのように読むべきか説明してもらえますか? 実際の例も大歓迎です:-)

どうもありがとう!

- - 編集 - -

これはうまくいくようです:

A.CallTo(() => dataAttributesController
    .ReadFileChunk(A<string>.Ignored, A<int>.Ignored, A<int>.Ignored, out resSize))
    .ReturnsLazily(x =>
           Encoding.UTF8.GetBytes("You requested: " + x.Arguments.Get<string>(0) + "(" + x.Arguments.Get<int>(1) + "," + x.Arguments.Get<int>(2) + ")"))
    .AssignsOutAndRefParameters((long)123);

私が望んでいたよりも少し読みにくいですが、これはReturnsLazilyの使用目的に近いですか?

4

2 に答える 2