我有一个名为Common的属性TxRx。 Common然后有一个名为LastMod的属性。我想写一个RhinoMock期望来表明LastMod已被设置了一些东西。所以我试过了:
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 ...
我认为这意味着Common需要是虚拟的,但由于它是LinqToSql生成的类的一个属性,我无法使其成为虚拟(除了黑客自动代码,这不是一个真正的选项)。
有什么方法吗?
答案 0 :(得分: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; }
...
}
不理想(也就是为了模拟性而传递包装器会有点麻烦!)但这是你可以让RhinoMocks为你模拟属性/方法的唯一方法。
另一种选择是使用TypeMock代替我认为使用不同的机制来模拟东西。不过,我不认为它是免费的。
答案 1 :(得分:0)
您需要用
替换您的第二个期望txRx.Expect(() => common.LastMod).SetPropertyAndIgnoreArgument();
但Common属性本身需要虚拟才能实现。