8

我在我正在处理的一些单元测试中使用 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....

这可能吗?如果是这样,我如何以这种方式使用假货?

4

1 回答 1

5

经过一些实验,我找到了一个可行的解决方案,尽管它不是最优雅的。

这是您的常规代码:

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

于 2012-10-05T10:58:20.053 回答