, если вы собираетесь заниматься программированием на AD и хотите протестировать его, подумайте о написании оболочки, которую вы можете использовать вместо ОБА SearchResult и DirectoryEntry - что Кстати, в качестве дополнительного преимущества вам не нужно писать две функции, которые должны принимать SearchResult или DirectoryEntry.
Я сделал что-то похожее на это. Это был не совсем вечерний проект, но он того стоил, учитывая, что я работал над продуктом ISV AD. Вы можете, вероятно, обернуть меньше и уменьшить усилия. Вот макет псевдокода, чтобы дать вам представление:
DirectoryObject : IDirectoryObject, IDisposable (Important!)
ctor (DirectoryEntry)
ctor (SearchResult)
ctor (string Path)
string Path
bool IsValid
Search(with a gazillion overloads)
DirectoryObjectPropertyCollection Properties
//(which itself uses DirectoryObjectPropertyValueCollection to wrap PropertyValueCollection)
//To get at the native underlying objects if necessary since I only wrapped commonly used elements
DirectoryEntry NativeDirectoryEntry
SearchResult NativeSearchResult
//So I know whether to grab the native SearchResult or DirectoryEntry
IsDirectoryEntry
IsSearchResult
Этот подход - помимо повышенной тестируемости - избавляет меня от необходимости делать что-то подобное в наших общих библиотеках:
public void DoSomethingWithAUser(DirectoryEntry user,...)
public void DoSomethingWithAUser(SearchResult user,...)
public void DoSomethingWithAUser(string userPath,...)
и теперь у нас просто
public void DoSomethingWithAUser(DirectoryObject user,...)