如何使用Moq模拟NamespaceManager类方法?

时间:2016-11-21 14:36:39

标签: c# unit-testing moq

https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.namespacemanager?redirectedfrom=MSDN#microsoft_servicebus_namespacemanager

我想模拟CreateTopicAsync方法。但由于班级的密封性,我无法嘲笑班级。 谁知道?

1 个答案:

答案 0 :(得分:3)

你无法模拟sealed课程。模拟依赖于继承来构建数据的快速副本。因此,试图模拟sealed类是不可能的。

那我该怎么办?

你能做的就是写一个包装器:

public class NamespaceManagerWrapper : INamespaceManagerWrapper 
{
   private NamespaceManager _instance;

   public NamespaceManagerWrapper(NamespaceManager instance)
   {
      _instance = instance;
   }

   public ConsumerGroupDescription CreateConsumerGroup(ConsumerGroupDescription description)
   {
       return _instace.CreateConsumerGroup(description);
   }

   etc....
}

模拟界面

public interface INamespaceManagerWrapper
{
   ConsumerGroupDescription CreateConsumerGroup(ConsumerGroupDescription description);
   ....etc.
}

您的方法现在应该接受原始对象上的包装器接口:

public void myMethod(INamespaceManagerWrapper mockableObj)
{
   ...
   mockableObj.CreateConsumerGroup(description);
   ...
}

现在您可以模拟界面:

Mock<INamespaceManagerWrapper> namespaceManager = new Mock<INamespaceManagerWrapper>();
....etc.

myObj.myMethod(namespaceManager.Object);

不幸的是,这是你能做的最好的事情。这是HttpContextWrapper

的简单实现