2011-07-28 5 views
4

이것은 Moq에만 국한된 것이 아니라 일반적인 Mocking 프레임 워크 관련 질문입니다. "IAsset"유형의 객체에 대한 mock 객체를 만들었습니다. IAsset의 getter 인 "Info"에서 반환되는 유형을 조롱하고 싶습니다.이 추상 클래스를 Moq과 어떻게 조롱해야합니까?

var mock = new Mock<IAsset>(); 
     mock.SetupGet(i => i.Info).Returns(//want to pass back a mocked abstract); 
     mock.SetupProperty(g => g.Id, Guid.NewGuid()); 

문제는 내가 반환 한 속성 값을 모의하는 것입니다.

mock.SetupGet(i => i.Info).Returns(//this is the type I need to mock); 

이 속성에는 추상 형식이 있습니다. 이 형식은 XDocument를 확장합니다.

public abstract class SerializableNodeTree : XDocument, ISerializable{...} 

그래서 .. 내가 뭘하고 싶은 것은 이것이다 :

var nodeTreeMock = new Mock<SerializableNodeTree>(); 
     nodeTreeMock .SetupGet(d => d.Document).Returns(xdoc); 

xdoc이하여 XDocument 인스턴스입니다. 이것은 XDocument.Document getter가 가상이 아니기 때문에 작동하지 않습니다. 어떤 의미가 있습니다.

필자는 SerializableNodeTree에서 파생 된 모의 코드를 작성해야합니까, 아니면이 객체를 모의 할 수있는 방법일까요?

답변

3

이와 같은 경우, 나는 XDocument를 string과 같은 대부분의 POCO 및 기본 유형과 같은 표준 비 깨목 객체로 취급합니다. 즉, IAsset.Info에서 돌아 오기 위해 실제 (비 조롱 된) SerializableNodeTree를 만들어야합니다.

또 다른 옵션은 SerializableNodeTree을 모의하려는 모든 메소드가있는 인터페이스로 구현하고 IAsset.InfoSerializableNodeTree 대신 직접 인터페이스 유형을 반환하도록하는 것입니다.

+0

첫 번째 제안을 사용하기로 결정하고 SerializableNodeTree의 테스트 구현을 만들었습니다. – Nick

0

이 경우 필자는 추상 클래스에서 파생 된 테스트 이중을 만들 것입니다. 테스트에서 필요한 것을 제공 해줄 것입니다.

public class SerializableNodeTreeDouble : SerializableNodeTree 
{ 
    public new XDocument Document 
    { 
    get;   
    set; 
    } 

    ... 
} 

public void TestMethod() 
{ 
    SerializableNodeTreeDouble testDouble = new SerializableNodeTreeDouble(); 
    testDouble.XDocument = xdoc; // your xdoc 

    ... 
} 

희망이 있습니다.

+0

'Document' 속성이 가상이 아니라면, 원래의'Document' 속성을 숨길 수는 있지만 무시할 수는 없습니다. 따라서 모의 클래스가 정의한 속성 가져 오기 도구를 호출하지 않을 것으로 예상됩니다. – StriplingWarrior

+0

새로운 수정 자 (modifier)는 기본 클래스 구현을 숨기므로 여기서 의존성을 조롱 할 수 있습니다. 다음은 새로운 수정자를위한 MSDN입니다. http://msdn.microsoft.com/en-us/library/435f1dw2.aspx –

+0

예,'new' 수정자는 원래의 'Document' 속성을 감추고 * 사용하는 것입니다. 그러나'SerializableNodeTree.Document'를 호출하는 코드는 기본 객체가'SerializableNodeTreeDouble' 인 경우에도'SerializableNodeTreeDouble.Document'를 호출하지 않습니다. 그 행동을 얻으려면 메서드를 '오버라이드'해야합니다. 정의 된 메서드가 추상 또는 가상이 아닌 경우 정적으로도 Moq를 통해도 수행 할 수 없습니다. – StriplingWarrior

관련 문제