2012-03-13 4 views
1

2つのシグネチャでメソッドをモックできますか?Rhino Mocks - 2つのシグネチャを持つメソッドにExpect.Callを使用

sudoのコード:

public Class ClassA{ 
    //... do stuff 
} 

public Class ClassB{ 
    //... do stuff 
} 

public Class BigClass 
{ 
    public BigClass(){} 

    public ClassB MapMe(ClassA a) 
    { 
    //... do stuff 
    return new ClassB(); 
    } 

    public ClassA MapMe(ClassB a) 
    { 
    //... do stuff  
    return new ClassA(); 
    } 
} 

public Class ClassToTest 
{ 
    public void DoSomething() 
    { 
    var ResultA = BigClass.MapMe(new ClassA()); 

    //... do some more stuff 

    ResultA = BigClass.MapMe(new ClassB()); 
    } 
} 

貧弱なコード例について謝罪、iPadでこれをやって、うまくいけばあなたのアイデアを提供します。

+4

それは明らかではありません)。私はあなたがこの質問を削除することをお勧めしますあなたが本当に*良い*質問を書くことができるコンピュータで、あなたが試したことと何が起こったかを示す適切な例で、待っていることをお勧めします。 –

+0

grumpy、LinkedInの開発者フォーラムの人々には、ホテルの部屋ではあなたの記憶とiPadだけがあるかもしれないということを理解できるようだ。 –

+5

しかしその場合、あなたはすぐに答えを得ることがとても信じられないほど緊急ですか?とにかくそれをテストしたり使用したりすることはできません。質問に答えようとしている人には配慮しないでください。 http://tinyurl.com/so-hints –

答えて

7

だけArgument Constraints

引数の制約も 引数の型を指定することで、メソッドのシグネチャを定義します。それが省略できない理由です。

mock.Expect(x => x.MapMe(Arg<ClassB>.Is.Anything).Return(resultB); 
mock.Expect(x => x.MapMe(Arg<ClassA>.Is.Anything).Return(resultA); 

EDIT:

私はあなたが直面している他の問題を信じて - あなたはRhinoMocksは、このようなモックの期待を設定することはできません明らかにしてインターフェースをバックアップせずにBigClassを嘲笑しました。だから、それに基づいて、インターフェイスおよび模擬によって抽象BigClass:明白な答えは、もちろん、単に(または理想的なインターフェース「あなたは1つのシグネチャを持つクラスをモックと同じ方法」ではありませんなぜ

public interface IMapper 
{ 
    ClassB MapMe(ClassA entity); 
    ClassA MapMe(ClassB entity); 
} 

public class BigClass : IMapper 


[Test] 
public void MapperTest() 
{ 
    // !!! Below I've used WhenCalled() to show you that correct 
    // expectation is called based on argument type, just see in debugger 
    IMapper mapperMock = MockRepository.GenerateMock<IMapper>(); 
    mapperMock.Expect(x => x.MapMe(Arg<ClassA>.Is.Anything)) 
       .WhenCalled((mi) => 
         { 
          Debug.WriteLine("MapMe - ClassA parameter"); 
         }) 
       .Return(null /*TODO: return correct instance*/); 
    mapperMock.Expect(x => x.MapMe(Arg<ClassB>.Is.Anything)) 
       .WhenCalled((mi) => 
         { 
          Debug.WriteLine("MapMe - ClassB parameter"); 
         }) 
       .Return(null /*TODO: return correct instance*/); 

    var resultB = mapperMock.MapMe(new ClassA()); 
    var resultA = mapperMock.MapMe(new ClassB()); 

    // TODO: Asserts 
} 
+0

を読んでください多くのおかげで、私はこれを試して失敗したと言っているはずです、今はエラーを覚えていないが、私は朝に仕事になるときにそれを追加します。 –

+0

もまたいくつか試してみましたが、テスト済みの方法を繰り返し保存することで、朝にこれらを追加します。エラーがどこにあったのかは正確には思い出せませんが、リプレイオールではないと思います。 –

+0

私はあなたが裏づけインターフェースなしでクラスを嘲笑したと信じています、更新された答えを見てください。とにかく、実際に使用しているコードを追加してください。 – sll

関連する問題