2011-08-09 14 views
20

RhinoMockを使用して、プロパティのゲッター値をスタブしようとしています。このプロパティーは、ゲッター・アクセスのみを持つインターフェースの一部として定義されています。プロパティをスタブするRhino Mockを使用する

「無効な呼び出し、最後の呼び出しが使用されたか、呼び出しが行われていません(仮想(C#)/オーバーライド(VB)メソッドを呼び出していることを確認してください)これは私がスタブしているプロパティが仮想ではないことを意味するかもしれません。しかし、それはインターフェイスの一部であり、なぜこのエラーが発生するのかわかりません。

以下はコードスケルトンです。 "stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior();"という行のコメントを外すと、 "プロパティを読み書きする必要があります"という新しいエラーが発生します。私はSOで検索し、thisページを見つけました。しかし、提案された解決策は私を助けません。何かご意見は?

public interface IStore { 
     string StoreDeviceID {get;} 
     //other methods 
    } 

    public static class Store { 
     private IStore Repository; 

     public void SetRepository(IStore rep){ 
      Repository = rep; 
     } 

     public StoredeviceID { 
      get{ 
       return Repository.StoreDeviceID; 
      } 
     } 

     //other methods 
    } 

    public class TestClass { 
     [Test] 
     public void TestDeviceID() { 
      var stubRepository = 
       MockRepository.GenerateStub<IStore>(); 
      Store.SetRepository(stubRepository); 

      //stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior(); 
      SetupResult.For(stubRepository.StoreDeviceID).Return("test"); 

      Assert.AreSame(Store.StoreDeviceID, "test"); 
     } 
    } 

答えて

28

これは読み取り専用のプロパティですので、あなたが言う必要があります。スタブと通常

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 

を、プロパティは、通常のC#のプロパティのように使用されています。だから、非読み取り専用のプロパティのために、あなたが言う:stubRepository.someProperty = "test";

はまた、あなたは関係なく、それはモックやスタブをだかどうか、特定の方法で動作するように方法を設定したい場合、あなたはいつも言うことに注意してください。

stubRepository.Stub(x => x.someMethod()).Return("foo"); 

スタブが自分の必要な依存関係を使用してユニットテストを供給することがありますが、上で検証を実行するためにそこにではありません、覚えておいてください。それがモックのためのものです。

特定の方法で動作する依存関係を指定する場合は、スタブを使用します。特定の依存関係が正しく相互作用していることを確認する場合は、Mockを使用します。 (発行済)から

Rhino Wikiは:

A mock is an object that we can set expectations on, and which will verify that the expected actions have indeed occurred. A stub is an object that you use in order to pass to the code under test. You can setup expectations on it, so it would act in certain ways, but those expectations will never be verified. A stub's properties will automatically behave like normal properties, and you can't set expectations on them.

If you want to verify the behavior of the code under test, you will use a mock with the appropriate expectation, and verify that. If you want just to pass a value that may need to act in a certain way, but isn't the focus of this test, you will use a stub.

IMPORTANT: A stub will never cause a test to fail.

+0

@ Adam、プロパティは読み取り専用なので、設定できません。ただし、Stubに提供したコードスニペットは完全に機能します。愚かな私は、それ以外のすべてのオプションを試しました:) – Santhosh

+0

StoreDeviceIDにはセッターがないので、最初のステートメント 'stubRepository.StoreDeviceID =" test ";'は機能しません。 –

+0

ああ - 申し訳ありません。私は私の答えを更新します - うまくいけばうれしいです。 –

4

あなたはスタブで次の操作を行うことができます。

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 

は、これはStoreDeviceIDのゲッターへの呼び出しのために "test" を返すようになります。

関連する問題