2009-07-11 1 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 생성 된 클래스의 속성이기 때문에 내가 할 수 없습니다를 가상으로 만들어야합니다 (실제로는 옵션이 아닌 자동 코드를 해킹하는 것 외에는).

이 문제가 발생합니까? 당신은

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

그러나 일반 건물 자체와 두 번째 기대를 교체 할 필요가

답변

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

이 작동하는 가상 할 필요가있다.

+0

이것은 컴파일되지 않습니다. 컴파일하려면 람다식이 필요합니다. 공통점이 가상 일 필요가 있다는 데 동의합니다. 즉, 피하려고 한 것입니다. 오 잘. –

+0

지금 수정했습니다. –