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

How to Mock NamespaceManager Class Methods Using Moq?

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

我想模拟 CreateTopicAsync 方法。但是由于 class 的密封性质,我无法模拟 class。 有人知道吗?

你不能嘲笑 sealed class。 Mocking 依赖于继承来构建数据的动态副本。所以试图模拟 sealed class 是不可能的。

那我该怎么办?

你可以做的是写一个包装器:

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

的类似实现