8

作業中のいくつかの単体テストでMicrosoftFakesを使用しています。私のインターフェースは次のようになります。

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; }
}

このインターフェイスをMicrosoftFakesで使用して、スタブを生成してもらいたいです。問題は、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 に答える