سؤال

أرغب في كتابة الاختبارات الآلية التي تعمل في الثقة المتوسطة وتفشل إذا كانت تحتاج إلى ثقة كاملة.

أنا أكتب مكتبة حيث تكون بعض الوظائف متوفرة فقط في سيناريوهات الثقة الكاملة وأريد التحقق من أن الكود الذي أود تشغيله في الثقة المتوسطة سيعمل بشكل جيد. إذا كنت تريد أيضا معرفة أنه إذا قمت بتغيير فئة تتطلب ثقة كاملة، فستفشل اختباراتي.

لقد حاولت إنشاء AppDomain آخر وتحميل السياسة المتوسطة Trust SolutionLevel، لكنني دائما أخترجا مع التجميع أو لا يمكن تحميل اعتماده أثناء محاولة تشغيل رد الاتصال AppDomain الصليب.

هل هناك طريقة لسحب هذا؟

تحديث: الردود القائمة، هنا هو ما لدي. لاحظ أنه يجب اختبار الفصل الخاص بك اختبار marshalbyrefobject. هذا هو الحد جدا، لكنني لا أرى طريقة حولها.

using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using Xunit;

namespace PartialTrustTest
{
    [Serializable]
    public class ClassUnderTest : MarshalByRefObject
    {
        public void PartialTrustSuccess()
        {
            Console.WriteLine( "partial trust success #1" );
        }

        public void PartialTrustFailure()
        {
            FieldInfo fi = typeof (Int32).GetField( "m_value", BindingFlags.Instance | BindingFlags.NonPublic );
            object value = fi.GetValue( 1 );
            Console.WriteLine( "value: {0}", value );
        }
    }

    public class Test
    {
        [Fact]
        public void MediumTrustWithExternalClass()
        {
            // ClassUnderTest must extend MarshalByRefObject
            var classUnderTest = MediumTrustContext.Create<ClassUnderTest>();

            classUnderTest.PartialTrustSuccess();
            Assert.Throws<FieldAccessException>( classUnderTest.PartialTrustFailure );
        }
    }

    internal static class MediumTrustContext
    {
        public static T Create<T>()
        {
            AppDomain appDomain = CreatePartialTrustDomain();
            var t = (T) appDomain.CreateInstanceAndUnwrap( typeof (T).Assembly.FullName, typeof (T).FullName );
            return t;
        }

        public static AppDomain CreatePartialTrustDomain()
        {
            var setup = new AppDomainSetup {ApplicationBase = AppDomain.CurrentDomain.BaseDirectory};
            var permissions = new PermissionSet( null );
            permissions.AddPermission( new SecurityPermission( SecurityPermissionFlag.Execution ) );
            permissions.AddPermission( new ReflectionPermission( ReflectionPermissionFlag.RestrictedMemberAccess ) );
            return AppDomain.CreateDomain( "Partial Trust AppDomain: " + DateTime.Now.Ticks, null, setup, permissions );
        }
    }
}
هل كانت مفيدة؟

المحلول

أنا فقط نشرت مقالا بعنوان اختبار الثقة الجزئي مع xunit.net. وبعد تفاصيل الإطار القائم على XUNIT.NET الذي نستخدمه على فريق إطار الكيان لممارسة التعليمات البرمجية بموجب الثقة الجزئية.

هنا مثال على استخدامه.

public class SomeTests : MarshalByRefObject
{
    [PartialTrustFact]
    public void Partial_trust_test1()
    {
        // Runs in medium trust
    }
}

// Or...

[PartialTrustFixture]
public class MoreTests : MarshalByRefObject
{
    [Fact]
    public void Another_partial_trust_test()
    {
        // Runs in medium trust
    }
}

نصائح أخرى

سرقت بلا خجل من كيفية استضافة رمل ثقة جزئي - # 7, ، ولكن إعادة تعيين (جنبا إلى جنب مع حالة اختبار بسيطة) في F # فقط للركلات :-)

open System
open System.Reflection
open System.Security
open System.Security.Permissions
open System.Security.Policy

type Program() =
    inherit System.MarshalByRefObject()
    member x.PartialTrustSuccess() =
        Console.WriteLine("foo")
    member x.PartialTrustFailure() =
        let field = typeof<Int32>.GetField("m_value", BindingFlags.Instance ||| BindingFlags.NonPublic)
        let value = field.GetValue(1)
        Console.WriteLine("value: {0}", value)

[<EntryPoint>]
let main _ =
    let appDomain =
        let setup = AppDomainSetup(ApplicationBase = AppDomain.CurrentDomain.BaseDirectory)
        let permissions = PermissionSet(null)
        permissions.AddPermission(SecurityPermission(SecurityPermissionFlag.Execution)) |> ignore
        permissions.AddPermission(ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess)) |> ignore
        AppDomain.CreateDomain("Partial Trust AppDomain", null, setup, permissions)

    let program = appDomain.CreateInstanceAndUnwrap(
                      typeof<Program>.Assembly.FullName,
                      typeof<Program>.FullName) :?> Program

    program.PartialTrustSuccess()

    try
        program.PartialTrustFailure()
        Console.Error.WriteLine("partial trust test failed")
    with
        | :? FieldAccessException -> ()

    0

و c # نسخة:

using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;

namespace PartialTrustTest
{
    internal class Program : MarshalByRefObject
    {
        public void PartialTrustSuccess()
        {
            Console.WriteLine("partial trust success #1");
        }

        public void PartialTrustFailure()
        {
            FieldInfo fi = typeof(Int32).GetField("m_value", BindingFlags.Instance | BindingFlags.NonPublic);
            object value = fi.GetValue(1);
            Console.WriteLine("value: {0}", value);
        }

        private static AppDomain CreatePartialTrustDomain()
        {
            AppDomainSetup setup = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory };
            PermissionSet permissions = new PermissionSet(null);
            permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
            permissions.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));
            return AppDomain.CreateDomain("Partial Trust AppDomain", null, setup, permissions);
        }

        static void Main(string[] args)
        {
            AppDomain appDomain = CreatePartialTrustDomain();

            Program program = (Program)appDomain.CreateInstanceAndUnwrap(
                typeof(Program).Assembly.FullName,
                typeof(Program).FullName);

            program.PartialTrustSuccess();

            try
            {
                program.PartialTrustFailure();
                Console.Error.WriteLine("!!! partial trust test failed");
            }
            catch (FieldAccessException)
            {
                Console.WriteLine("partial trust success #2");
            }
        }
    }
}
 C:  temp  partialtrusttest  bin  debug> partialtrusttest.exe نجاح الثقة الجزئية # 1 نجاح الثقة الجزئية # 2

لقد نشرت منشور مدونات من ثلاثة أجزاء على اختبار الوحدة في الثقة المتوسطة

أدور AppDomain بديلا بطريقة مماثلة لبعض الإجابات هنا، ولكن أعتبر أكثر من ذلك باستخدام Marshalbyrefobject لاستدعاء طريقة الاختبار في AppDomain الأخرى، مما يعني أن فئات الاختبار لا تحتاج إلى تطبيق Marshalbyrefobject

الجزء الثالث (يحتوي على روابط إلى الأجزاء الأخرى) هنا http://boxbinary.com/20inary/10/how-to-run-a-unit-test-in-medium-trust-with-nunitpart-three-umbraco-framework-testing/

لم أحاول أبدا القيام بذلك، ولكن بشكل عام، للتعامل مع فشل تحميل التجميع من AppDomains مخصص، يمكنك استخدام حدث AppDomain.Assemblyresolve.

على الرغم من أن غير مرتبط تماما، وهنا مثال على استخدام AppDomain.Assemblyresolve.

تعتمد الإجابة على ما يفعله الكود الخاص بك عندما يحاول شخص ما مع امتياز متوسطة الثقة الوصول إلى ميزة ثقة كاملة. أفترض أنه سيتم إلقاء نوع من الاستثناء.

في هذه الحالة، اكتب اختبار وحدة يعمل في سياق متوسطة الثقة، يحاول الوصول إلى ميزة ثقة كاملة، ويتوقع طرقا الاستثناء. إذا لم تكتب اختبارا مثل هذا، فستكون هناك طريقة شائعة للقيام بذلك بأن معظم أطر اختبار ستدعم هذا:

testMediumTrustUserWontAccessFeatureX()
{
    // set up the context of your test ...

    try
    {
        accessFullTrustFeature();
        fail("Test failed - Medium trust user can access full trust feature");
    }
    catch( SomeKindOfException e )
    {
        // Success - feature was denied to the untrusted user 
    }
}

إذا تم القبض على الاستثناء، فهذا يعني أن مستخدمك غير الموثوق به لم يتمكن من الوصول إلى الميزة (وتمضية الاختبار) ولكن إذا لم يتم القبض على الاستثناء أبدا، فشل الاختبار (كنا نتوقع استثناءا ولم يحصل عليه).

هذا هو رمز Java-Esque Pseudo ولكن هذا النمط يجب أن يعمل بأي شكل من اللغات التي تستخدمها في التعامل مع استثناء دعمها.

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