簡體   English   中英

我該如何用Moq模擬這個抽象類?

[英]How should I mock this abstract class with Moq?

這並不是Moq特有的,而是更多的一般Mocking框架問題。 我為類型為“IAsset”的對象創建了一個模擬對象。 我想模仿從IAsset的getter返回的類型,“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());

我遇到的問題是模擬這個返回的屬性值。

 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派生的模擬代碼,還是有辦法模擬這個對象?

在這種情況下,我會將XDocument視為標准的,不可模擬的對象,如string s和大多數POCO和本機類型。 也就是說,你應該創建一個真實的(非模擬的)SerializableNodeTree來從IAsset.Info返回。

另一個選擇是使SerializableNodeTree實現一個包含您想要模擬的所有方法的接口,並讓IAsset.Info返回該接口類型而不是SerializableNodeTree

在這種情況下,我將創建一個派生自您的抽象類的測試雙精度。 這將為您提供測試所需的內容。

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

   ...
}

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

   ...
}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM