我正在使用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....
这可能吗?如果是这样,我如何以这种方式使用Fakes?
答案 0 :(得分: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
。