2012-10-10 2 views
0

수업이MOQ - 가상 특성을 가진 개체가 뭔가를 외부

public abstract class TT 
{ 
    public virtual int ID { get; set; } 
} 
public class X 
{ 
    public void F(TT t) 
    { 
     t.ID = 100; 
    } 
} 

기능 X.F 사용 TT처럼 쓸 수 없습니다. I 어떤 테스트 F.

그래서

[TestMethod] 
public void T() 
{ 
    var t = new Mock<TT>(); 
    new X().F(t.Object); 
    Assert.AreEqual(100, t.Object.ID); 
} 

는하지만 t.Object.ID는 항상 "0"이다. 가상 ID가 아닌 ID를 설정하면 전달됩니다.

그렇다면 왜 그렇습니까? 그리고 가상 속성을 어떻게 만들 수 있습니까?

답변

2

문제는 Moq이 어떻게 실제로 mock을 빌드하는지에 있습니다. 이 경우에는 클래스를 확장하고 재정 의하여 작업을 수행하므로 가상으로 표시된 속성은 Moq에서 처리 할 속성입니다.

t.SetupProperty(f => f.ID); 

그리고 당신은 또한 MOQ를 사용하여 모든 속성을 설정 할 수 있습니다 :

t.SetupAllProperties(); 

의 많은

그래서 내가 뭘 구현에없는 것은 재산에 대한 설정이라고 생각 유용한 예제는 여기에서 찾을 수 있습니다. http://code.google.com/p/moq/wiki/QuickStart

+0

끝났습니다! 고마워요 ~ : D – peter

2

TT는 인터페이스가 아닌 가상 메서드가있는 클래스이므로 다른 옵션입니다.

Pablo의 대답에서 언급했듯이 Moq는 클래스를 확장하여 가상 속성을 오버 라이딩합니다. 그러나, 어떤 설정이 정의되어 있지 않은 경우 원래의 (오버라이드 된) 버전을 사용하도록 Moq에 지시하는 옵션 인 CallBase이 있습니다.

mock에서 CallBase를 true로 설정하면 원래 속성이 호출되고 속성을 명시 적으로 설정할 필요가 없습니다.

[TestMethod] 
public void T() { 
    var t = new Mock<TT>() { CallBase = true }; 
    new X().F(t.Object); 
    Assert.AreEqual(100, t.Object.ID); 
} 

이것은() SetupUpAllProperties를 사용하는 것보다 더 나은 해답이 아니라 하나에 대해서만 일부 기능을 설정을 사용하고자하는 상황에서 매우 유용하다.

+0

참으로 또 다른 위대한 대안! 우리는 이것에 대한 공유 크레딧을 얻어야합니다 :) –

관련 문제