我正在尝试对一些Active Directory代码进行单元测试,与此问题中概述的代码几乎相同:

Create an instance of DirectoryEntry for use in test

可接受的答案建议为DirectoryEntry类实现包装器/适配器,我有:

public interface IDirectoryEntry : IDisposable
{
    PropertyCollection Properties { get; }
}

public class DirectoryEntryWrapper : DirectoryEntry, IDirectoryEntry
{
}

问题是我的IDirectoryEntry模拟中的“属性”属性未初始化。尝试像这样设置模拟:
this._directoryEntryMock = new Mock<IDirectoryEntry>();
this._directoryEntryMock.Setup(m => m.Properties)
                        .Returns(new PropertyCollection());

导致以下错误:

类型'System.DirectoryServices.PropertyCollection'没有定义构造函数

据我了解,尝试仅使用内部构造函数实例化一个类时会引发此错误:

The type '...' has no constructors defined

我试图为PropertyCollection类编写包装器/适配器,但是如果没有公共(public)构造函数,我将不知道如何实例化或从类继承。

那么,如何在DirectoryEntry类上模拟/设置“Properties”属性以进行测试?

最佳答案

我认为您无法模拟或创建PropertyCollection实例。有多种方法可以解决此问题,但是它们要求您将派生的包装器类转换为更多的实际包装器,封装DirectoryEntry对象并提供访问器,而不是对其进行扩展。完成此操作后,您可以使用以下选项:

  • Properties属性的返回类型定义为PropertyCollection实现的基础集合类型之一(IDictionaryICollectionIEnumerable),如果这足以满足您的需要
  • 创建一个带有PropertyCollection接口(interface)的封装包装类,并在每次将directoryEntry.Properties访问器称为
  • 时创建一个新的包装Properties的类。
  • IDirectoryEntry/DirectoryEntryWrapper上创建返回所需信息的方法,而不必公开Properties属性

  • 如果可以通过基础集合类型之一访问属性,则1作为一种解决方法可能很好。 2将要求您在包装器中实现PropertiesCollection的每个方法和属性,并调用其下面的封装对象,但这将是最灵活的。最简单(但最不灵活)的是3。

    关于c# - 模拟DirectoryEntry的 “Properties”属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18056483/

    10-11 05:57