Come si riferisce a uno stub che ha un parametro generico di per sé usando Microsoft Fakes?
-
12-12-2019 - |
Domanda
Sto usando Microsoft Fakes in alcuni test Unità su cui sto lavorando.La mia interfaccia sembra questa:
interface ISecuredItem<TChildType> where TChildType : class, ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
.
Una tipica implementazione di questo sembra:
class RegistryKey : ISecuredItem<RegistryKey>
{
public SecurityDescriptor Descriptor { get; private set; }
public IEnumerable<RegistryKey> Children { get; }
}
.
Mi piacerebbe usare questa interfaccia con Microsoft Fakes, e generare uno stub per me.Il problema è che gli usi FORM FAKE è StubInterfaceNameHere<>
, quindi nell'esempio precedente si finisce per cercare di fare qualcosa come StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....
è possibile?Se è così, come posso usare i falsi in questo modo?
Soluzione
Dopo qualche sperimentazione ho trovato una soluzione di lavoro anche se non è la più elegante.
Questo è il tuo codice regolare:
public interface ISecuredItem<TChildType>
where TChildType : ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
.
Nel progetto di test crei un'interfaccia di StubimpleMtation
public interface StubImplemtation : ISecuredItem<StubImplemtation> { }
.
Quindi nel test dell'unità puoi fare quanto segue:
var securedItemStub = new StubISecuredItem<StubImplemtation>
{
ChildrenGet = () => new List<StubImplemtation>(),
DescriptorGet = () => new SecurityDescriptor()
};
var children = securedItemStub.ChildrenGet();
var descriptor = securedItemStub.DescriptorGet();
.
È possibile saltare l'intero StubImplementation
e utilizzare RegistryKey
se non è un problema.