2012-01-04 13 views
3

私はMachine.Fakesで難局を打ちました。私はoutパラメータを模倣する方法を理解することができませんのみ Machine.Fakes機器。 RhinoMocksのa bugのため、私はMakeアダプタをFakeItEasyに切り替えました。私が知る限り、どのアダプタも交換可能でなければなりません。モックフレームワークとは独立してMachine.Fakesで 'out'パラメータをモックするにはどうしたらいいですか?

ArgはRhino.Mocksなので、これにより "out"テストが失敗し、このように見えるものはコンパイルされなくなるという問題があります。

The<IMembershipService>() 
    .WhenToldTo(x => x.CreateUser(Param<string>.IsAnything, 
     Param<bool>.IsAnything, 
     Param<object>.IsAnything, 
     out Arg<MembershipCreateStatus> 
      .Out(MembershipCreateStatus.UserRejected) 
      .Dummy)) 
    .Return(user); 

私は元Arg<T> paramはそれを設定値と同じ値に設定された「ダミー」のローカル変数を、使用してみましたが、これは私のテストが失敗する原因となった - 値がされていないかのように思えます通りました! Arg<T>には本当に解決策がありましたが、Rhino.Mocksの一部であるため、これ以上使用することはできません。

答えて

2

バージョン1.7.0 Machine.Fakes以来outと偽の呼び出しでrefパラメータを設定サポートしています - ときFakeItEasyまたはNS代替アダプタを使用してください。したがって、FakeItEasyを直接使用する必要はありません。 Alexの例は次のように簡略化することができます:

using Machine.Fakes; 
using Machine.Specifications; 

namespace MSpecMFakesOutParam 
{ 
    public interface IFoo 
    { 
     void Foo(out int foo); 
    } 

    public class When_using_FakeItEasy_with_out_params : WithFakes 
    { 
     static int Out; 

     Establish context =() => 
     { 
      int ignored; 
      The<IFoo>().WhenToldTo(x => x.Foo(out ignored)).AssignOutAndRefParameters(42); 
     }; 

     Because of =() => The<IFoo>().Foo(out Out); 

     It should_assign_the_out_param =() => Out.ShouldEqual(42); 
    } 
} 
+0

+1これはvoidメソッドでのみ動作するようですか?多くの場合、 'out'パラメータが追加の戻り値を返すために使用されているため、少し制限があるようです。 – MattDavey

+0

はい、@MattDavey、私はvoidメソッドのためにこれを実装しました。私はそれが制限されていることに同意しますが、それをクエリ用に実装するとAPIが複雑になります。 –

+0

さらに、outパラメータのサポートは、元々実装されていませんでした。 .NET Frameworkでもパラメータを使用しているので、これは価値のある選択肢だと思います。しかし、私は、戻り値と1つのメソッドのoutパラメータが良い設計であると言っています。私はタプルを返すか、複数のパラメータを持つと言うでしょう。だから、私はMFakesをこのように強く主張し続けました。 –

5

この場合、FakeItEasyを直接使用する必要があります。私は問題は、FakeItEasyがAssignsOutAndRefParametersを偽のオブジェクト呼び出し仕様に追加することによってoutパラメータを設定する必要がある方法にあると思います。 Machine.Fakesが行うことは、WhenToldToなどを、使用されるfakingフレームワークの適切なAPIに変換するので、問題ではありません。

using FakeItEasy; 

using Machine.Fakes; 
using Machine.Specifications; 

namespace MSpecMFakesOutParam 
{ 
    public interface IFoo 
    { 
    void Foo(out int foo); 
    } 

    public class When_using_FakeItEasy_with_out_params : WithFakes 
    { 
    static IFoo Foo; 
    static int Out; 

    Establish context =() => 
    { 
     Foo = An<IFoo>(); 

     var ignored = A<int>.Ignored; 
     A.CallTo(() => Foo.Foo(out ignored)).AssignsOutAndRefParameters(42); 
    }; 

    Because of =() => Foo.Foo(out Out); 

    It should_assign_the_out_param = 
    () => Out.ShouldEqual(42); 
    } 
} 
8

Machine.Fakesはこのシナリオを処理しません。単に実装されていないだけです。

私は個人的にパラメータを使用せず、(実際に複数の戻り値を返す必要がある場合は)タプル(Tuple < T、K >)またはそのようなシナリオのカスタムクラスを使用します。だからこそ私の優先順位は決して高くありませんでした。

私はそれに目を通していませんが、Machine.Fakesのrefおよびoutパラメータの処理を実装することは実現可能ではない可能性があります。いくつかのモッキングフレームワークの上にラッパーを実装する際の課題の1つは、成功するためには、すべてのモックフレームワークがどのように動作するかに共通の分母を持つ必要があるということです。 Machine.Fakesは、私が(NS substitute/FakeItEasyとRhino/Moqの2つの場合にのみ)共通の分母を見つけることができなかったので、今すぐイベントを模擬することもサポートしていません。あなたは私たちが話しているインターフェースをコントロールしている場合

  1. は、あなたがタプルまたはカスタムクラスを経由して、問題を回避することができます:私はそれを見たよう

    あなたは現在、2つの選択肢を得ました。

  2. インターフェイスを所有していない場合、アレクサンダーグロス(Alexander Gross)が提案したような場合には、いつでも基本的なモックフレームワークに戻すことができます。

申し訳ありませんが、あなたに良い答え;-)

  • ビョルンを与えていないため
関連する問題