كيف يمكن للمرء أن يشير إلى كعب روتين يحتوي على معلمة عامة خاصة به باستخدام Microsoft Fakes؟

StackOverflow https://stackoverflow.com//questions/12680378

سؤال

أنا أستخدم 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....

هل هذا ممكن؟إذا كان الأمر كذلك، كيف يمكنني استخدام المنتجات المزيفة بهذه الطريقة؟

هل كانت مفيدة؟

المحلول

بعد بعض التجارب، وجدت حلاً عمليًا على الرغم من أنه ليس الأكثر أناقة.

هذا هو الكود العادي الخاص بك:

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 إذا لم يكن هذا مشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top