Как можно ссылаться на заглушку, которая имеет общий параметр, используя Microsoft Fakes?
-
12-12-2019 - |
Вопрос
Я использую Microsoft Fakes в некоторых модульных тестах, над которыми работаю.Мой интерфейс выглядит так:
interface ISecuredItem<TChildType> where TChildType : class, ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
Типичная реализация этого выглядит так:
class RegistryKey : ISecuredItem<RegistryKey>
{
public SecurityDescriptor Descriptor { get; private set; }
public IEnumerable<RegistryKey> Children { get; }
}
Я хотел бы использовать этот интерфейс с Microsoft Fakes и создать для меня заглушку.Проблема в том, что форма, которую использует Fakes, StubInterfaceNameHere<>
, поэтому в приведенном выше примере вы пытаетесь сделать что-то вроде StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....
Это возможно?Если да, то как мне использовать Fakes таким образом?
Решение
После некоторых экспериментов я нашел рабочее решение, хотя оно и не самое элегантное.
Это ваш обычный код:
public interface ISecuredItem<TChildType>
where TChildType : ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
В своем тестовом проекте вы создаете интерфейс StubImplemtation.
public interface StubImplemtation : ISecuredItem<StubImplemtation> { }
Затем в модульном тесте вы можете сделать следующее:
var securedItemStub = new StubISecuredItem<StubImplemtation>
{
ChildrenGet = () => new List<StubImplemtation>(),
DescriptorGet = () => new SecurityDescriptor()
};
var children = securedItemStub.ChildrenGet();
var descriptor = securedItemStub.DescriptorGet();
Вы можете пропустить весь StubImplementation
и использовать RegistryKey
если это не проблема.