6

我有一个TargetContainerDto具有 2 个内部属性的公共类()。一个枚举和一个包含来自该枚举的值的类型。

我正在尝试对类型进行单元测试,但我遇到了问题。

internal enum TargetContainerType
{
    Endpoint,
    Group,
    User,
    UserGroup
}


internal TargetContainerType Type { get; set; }

这是我在测试类中的反射代码

public void setType(TargetContainerDto t, int val)
{
    BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance;
    PropertyInfo pi = t.GetType().GetProperty("Type", bf);
    pi.SetValue(t, val, null);
}

public TargetContainerDto setTypeTo(TargetContainerDto t, int val)
{
    setType(t, val);
    return t;
}

TargetContainerDto具有比 Type 更多的属性,但它们是公开的,因此可以测试它们。这iconURL是一个TargetContainerDto根据类型定义的字符串。这是我的测试方法:

public void DefaultSubGroupIcon()
{
    var o1 = new TargetContainerDto
    {
        Id = 1234,
        DistinguishedName = "1.1.1.1",
        SubGroup = "test",
    };
    setType(o1, 3);
    Assert.AreEqual(o1.IconUrl, "/App_Themes/Common/AppControl/Images/workstation1.png");
}

当我需要设置类型值时,我在测试方法中调用 setTypeTo,但我得到了一个MethodAccessException. 我认为这是因为我无法访问枚举。如何通过反射访问枚举?

谢谢

4

3 回答 3

11

使用属性标记您的程序集,InternalsVisibleTo您不需要在测试 dll 中使用反射。

例如,在应用程序 dll 的 AssemblyInfo.cs 文件中添加以下行:

[assembly:InternalsVisibleTo("TestAssembly")]

请参阅此处了解更多详细信息。

于 2013-04-05T09:43:53.967 回答
6

你问错问题了。一个更好的问题是:

如何停止测试类的内部状态?

但是,如果你完全需要这个,这个相关的SO 答案中描述了几种方法

于 2013-04-05T09:45:36.873 回答
1

我同意您应该尝试重新设计以避免测试内部状态的其他评论,但是我确实尝试了您的代码并且它对我来说很好(VS2012 上的.Net 4)。

我正在测试的类库如下所示:

using System;

namespace ClassLibrary
{
    internal enum TargetContainerType
    {
        Endpoint,
        Group,
        User,
        UserGroup
    }

    public class TargetContainerDto
    {
        internal TargetContainerType Type
        {
            get;
            set;
        }

        public void Print()
        {
            Console.WriteLine(Type);
        }
    }
}

测试程序(控制台应用程序)如下所示:

using System;
using System.Reflection;
using ClassLibrary;

namespace Demo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var test = new TargetContainerDto();
            setType(test, 1);
            test.Print();
        }

        public static void setType(TargetContainerDto t, int val)
        {
            BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance;
            PropertyInfo pi = t.GetType().GetProperty("Type", bf);
            pi.SetValue(t, val, null);
        }
    }
}

Group正如预期的那样,这会打印出来。如果我们能确定这与您的实际代码之间的差异,我们或许能够找到问题所在。

于 2013-04-05T09:52:30.630 回答