您的位置:首页 > 移动开发 > Objective-C

使用 nUnit 测试 Private 和 Protected 方法

2007-01-16 09:14 495 查看
Testing Protected Methods
要测试一个 protected 方法,我们的测试类需要继承包含这个 protected 方法的父类,然后在测试类中就可以公开使用这个 protected 方法了,示例如下:

假设要测试下面 ClassLibrary1.Class1 中的 MyProtectedMethod() 方法:

using System;

namespace ClassLibrary1
{
    /**//// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Class1
    {

        protected int MyProtectedMethod(int val1, int val2)
        {
            return val1 + val2;
        }

    } // end of class

} // end of namespace

下面是测试类代码:

using System;

using NUnit.Framework;

namespace ClassLibrary1
{
    /**//// <summary>
    /// Summary description for Tester.
    /// </summary>
    [TestFixture]
    public class Tester : Class1
    {
        [Test]
        public void MyProtectedMethod_Test()
        {
            Assert.AreEqual(5, base.MyProtectedMethod(2, 3));
        }

    } // end of class

} // end of namespace

Testing Private Methods

测试 private 方法需要使用反射

假设要测试下面 ClassLibrary1.Class1 中的 MyPrivateMethod() 方法:

using System;

namespace ClassLibrary1
{
    /**//// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Class1
    {

        protected int MyPrivateMethod(int val1, int val2)
        {
            return val1 + val2;
        }

    } // end of class

} // end of namespace

下面是测试类代码: 

using System;
using System.Reflection;

using NUnit.Framework;

namespace ClassLibrary1
{
4000

    /**//// <summary>
    /// Summary description for Tester.
    /// </summary>
    [TestFixture]
    public class Tester
    {
        [Test]
        public void MyPrivateMethod_Test()
        {
            ClassLibrary1.Class1 class1 = new ClassLibrary1.Class1();
            object[] aobjParams = new object[] { 3, 4 };
            object strRet;
            strRet = RunInstanceMethod( typeof(ClassLibrary1.Class1),
                "MyPrivateMethod",
                class1,
                aobjParams
            );
            Assert.AreEqual(7, strRet.ToString());
        }

        /**//// <summary>
        /// 运行静态方法
        /// </summary>
        /// <param name="t"></param>
        /// <param name="strMethod"></param>
        /// <param name="aobjParams"></param>
        /// <returns></returns>
        public static object RunStaticMethod(System.Type t, string strMethod, 
            object [] aobjParams) 
        {
            BindingFlags eFlags = 
                BindingFlags.Static | BindingFlags.Public | 
                BindingFlags.NonPublic;
            return RunMethod(t, strMethod, 
                null, aobjParams, eFlags);
        }

        /**//// <summary>
        /// 运行实例方法
        /// </summary>
        /// <param name="t"></param>
        /// <param name="strMethod"></param>
        /// <param name="objInstance"></param>
        /// <param name="aobjParams"></param>
        /// <returns></returns>
        public static object RunInstanceMethod(System.Type t, string strMethod, 
            object objInstance, object [] aobjParams) 
        {
            BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | 
                BindingFlags.NonPublic;
            return RunMethod(t, strMethod, 
                objInstance, aobjParams, eFlags);
        }

        /**//// <summary>
        /// 运行自定义方法
        /// </summary>
        /// <param name="t"></param>
        /// <param name="strMethod"></param>
        /// <param name="objInstance"></param>
        /// <param name="aobjParams"></param>
        /// <param name="eFlags"></param>
        /// <returns></returns>
        private static object RunMethod(System.Type t, string 
            strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags) 
        {
            MethodInfo m;
            try 
            {
                m = t.GetMethod(strMethod, eFlags);
                if (m == null)
                {
                    throw new ArgumentException("There is no method '" + 
                        strMethod + "' for type '" + t.ToString() + "'.");
                }
                                
                object objRet = m.Invoke(objInstance, aobjParams);
                return objRet;
            }
            catch
            {
                throw;
            }
        }

    } // end of class

} // end of namespace

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息