Search code examples
c#visual-studio-2012microsoft-fakes

How does one refer to a stub which has a generic parameter of itself using Microsoft Fakes?


I'm using Microsoft Fakes in some unit tests I'm working on. My interface looks like this:

interface ISecuredItem<TChildType> where TChildType : class, ISecuredItem<TChildType>
{
    SecurityDescriptor Descriptor { get; }
    IEnumerable<TChildType> Children { get; }
}

A typical implementation of this looks like:

class RegistryKey : ISecuredItem<RegistryKey>
{
    public SecurityDescriptor Descriptor { get; private set; }
    public IEnumerable<RegistryKey> Children { get; }
}

I'd like to use this interface with Microsoft Fakes, and have it generate a stub for me. The problem is, the form Fakes uses is StubInterfaceNameHere<>, so in the above example you end up trying to do something like StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....

Is this possible? If so, how do I use Fakes in this way?


Solution

  • After some experimentation I found a working solution although it's not the most elegant.

    This is your regular code:

    public interface ISecuredItem<TChildType>
        where TChildType : ISecuredItem<TChildType>
    {
        SecurityDescriptor Descriptor { get; }
        IEnumerable<TChildType> Children { get; }
    }
    

    In your test project you create a StubImplemtation interface

    public interface StubImplemtation : ISecuredItem<StubImplemtation> { }
    

    Then in your unit test you can do the following:

    var securedItemStub = new StubISecuredItem<StubImplemtation>
                              {
                                  ChildrenGet = () => new List<StubImplemtation>(),
                                  DescriptorGet = () => new SecurityDescriptor()
                              };
    
    var children = securedItemStub.ChildrenGet();
    var descriptor = securedItemStub.DescriptorGet();
    

    You can skip the whole StubImplementation and use RegistryKey if that's no problem.