Comment faire référence à un stub qui possède un paramètre générique lui-même à l'aide de Microsoft Fakes ?
-
12-12-2019 - |
Question
J'utilise Microsoft Fakes dans certains tests unitaires sur lesquels je travaille.Mon interface ressemble à ceci :
interface ISecuredItem<TChildType> where TChildType : class, ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
Une implémentation typique de ceci ressemble à :
class RegistryKey : ISecuredItem<RegistryKey>
{
public SecurityDescriptor Descriptor { get; private set; }
public IEnumerable<RegistryKey> Children { get; }
}
J'aimerais utiliser cette interface avec Microsoft Fakes et lui faire générer un stub pour moi.Le problème est que le formulaire utilisé par Fakes est StubInterfaceNameHere<>
, donc dans l'exemple ci-dessus, vous finissez par essayer de faire quelque chose comme StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....
Est-ce possible?Si oui, comment puis-je utiliser les Fakes de cette manière ?
La solution
Après quelques expérimentations, j'ai trouvé une solution efficace même si ce n'est pas la plus élégante.
Voici votre code habituel :
public interface ISecuredItem<TChildType>
where TChildType : ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
Dans votre projet de test, vous créez une interface StubImmplemtation
public interface StubImplemtation : ISecuredItem<StubImplemtation> { }
Ensuite, dans votre test unitaire, vous pouvez effectuer les opérations suivantes :
var securedItemStub = new StubISecuredItem<StubImplemtation>
{
ChildrenGet = () => new List<StubImplemtation>(),
DescriptorGet = () => new SecurityDescriptor()
};
var children = securedItemStub.ChildrenGet();
var descriptor = securedItemStub.DescriptorGet();
Vous pouvez sauter tout StubImplementation
et utilise RegistryKey
si ce n'est pas un problème.