Question

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?

Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top