2009-07-11 5 views
2

私はCommonというプロパティを持つTxRxクラスを持っています。 CommonにはLastModというプロパティがあります。私はLastModに何かが設定されていることを示すRhinoMockの期待を書いています。RhinoMockのプロパティチェーン

var txRx = MockRepository.GenerateMock<TxRx>(); 
var common = MockRepository.GenerateMock<Common>(); 

txRx.Expect(t => t.Common).Return(common); 
txRx.Expect(t => t.Common.LastMod).SetPropertyAndIgnoreArgument(); 

をしかし、私は次の例外を取得:だから私は試した

System.InvalidOperationException: Invalid call, the last call has been used or no call has been made (make sure that you are calling a virtual (C#)/Overridable (VB) method). 
    at Rhino.Mocks.LastCall.GetOptions[T]() 
    at Rhino.Mocks.RhinoMocksExtensions.Expect[T,R](T mock, Function`2 action) 
    at ... 

私は、これは一般的には仮想である必要が意味推測が、それは私がすることはできませんLinqToSql生成されたクラスのプロパティであるとして、それをバーチャルにしてください(本当にオプションではない自動コードをハッキングする以外に)。

これを回避する手段はありますか?

答えて

1

モック可能なクラス(つまり、オーバーライド可能なメソッドとプロパティを持っているか、興味のあるプロパティやメソッドを定義するインターフェイスを実装したいもの)に、TxRxをラップして渡すことが考えられますLinqToSQLクラス自体ではなく、ラッパーです。

おそらくのようなもの次

public class TxRxWrapper : ITxRxWrapper 
{ 
    private TxRx m_txrx; 

    public object LastMod 
    { 
     get { return m_txrx.Common.LastMod; } 
    } 

    ... 
} 

public interface ITxRxWrapper 
{ 
    public object LastMod { get; } 
    ... 
} 

理想的でないと(ちょうどmockabilityのためのラッパーを渡すために、やや面倒な取得することができます!)それはあなたがRhinoMocksのためのプロパティ/メソッドを模擬するために得ることができる唯一の方法です君は。

もう1つの選択肢は、代わりにTypeMockを使用して、別のメカニズムを使用して駄目にすることだと考えています。私はそれが無料だとは思わない。

0

あなたの

txRx.Expect(() => common.LastMod).SetPropertyAndIgnoreArgument(); 

を有する第二の期待しかし、それ自体はこれが動作するために仮想にする必要がある一般的なプロパティを交換する必要があります。

+0

これはコンパイルされません。コンパイルするにはラムダ式が必要です。私は一般的なものが仮想である必要があるように見えることに同意する、それは私が避けようとしていたものである。しかたがない。 –

+0

これを修正しました。 –

関連する問題