2009-07-11 17 views
2

我有一個叫做Common的屬性的TxRx類。常見的有一個名爲LastMod的屬性。我想寫一個RhinoMock的期望來表明LastMod已經設置了一些東西。所以,我想:RhinoMocks中的產業鏈

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嘲笑的屬性/方法的唯一途徑您。

另一種選擇是使用TypeMock而不是我認爲使用不同的機制來嘲笑的東西。不過,我認爲它不是免費的。

0

您需要與

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

但共同的屬性本身來代替你的第二個期望需要被虛擬了這個工作。

+0

這不會編譯,它需要Lambda表達式進行編譯。我同意,看起來Common需要是虛擬的,這正是我想要避免的。好吧。 –

+0

現在已經修復了這個問題。 –