Как я должен издеваться над этим абстрактным классом с Moq? - PullRequest
4 голосов
/ 29 июля 2011

Это не совсем специфично для Moq, а скорее является общим вопросом о Mocking framework.Я создал фиктивный объект для объекта типа "IAsset".Я хотел бы посмеяться над типом, возвращаемым из метода получения IAsset, "Info".

 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());

Проблема, с которой я сталкиваюсь - это Mocking этого возвращенного значения свойства.

 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 не является виртуальным.Что имеет смысл.

Должен ли я просто вручную написать макет, который является производным от SerializableNodeTree, или это способ издеваться над этим объектом?

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

В таком случае я бы рассматривал XDocument как стандартный немоделируемый объект, такой как string s и большинство POCO и нативных типов. Другими словами, вы должны создать реальное (не имитированное) SerializableNodeTree для возврата из IAsset.Info.

Другой вариант - заставить SerializableNodeTree реализовать интерфейс, содержащий все методы, которые вы хотите смоделировать, и заставить IAsset.Info возвращать этот тип интерфейса вместо SerializableNodeTree напрямую.

0 голосов
/ 29 июля 2011

В этом случае я бы создал двойник теста, производный от вашего абстрактного класса.Это даст вам то, что вам нужно в вашем тесте.

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

   ...
}

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

   ...
}

Надеюсь, это поможет.

...