我正在尝试对一些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
实现的基础集合类型之一(IDictionary
,ICollection
或IEnumerable
),如果这足以满足您的需要PropertyCollection
接口(interface)的封装包装类,并在每次将directoryEntry.Properties
访问器称为Properties
的类。IDirectoryEntry
/DirectoryEntryWrapper
上创建返回所需信息的方法,而不必公开Properties
属性如果可以通过基础集合类型之一访问属性,则1作为一种解决方法可能很好。 2将要求您在包装器中实现
PropertiesCollection
的每个方法和属性,并调用其下面的封装对象,但这将是最灵活的。最简单(但最不灵活)的是3。关于c# - 模拟DirectoryEntry的 “Properties”属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18056483/