我有一个公共类(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
中定义的字符串,具体取决于类型。这是我的Testmethod:
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");
}
当我需要设置typevalue时,我在test方法中调用setTypeTo,但是我得到了MethodAccessException
。我认为这是因为我无法访问枚举。如何通过反射访问枚举?
由于
答案 0 :(得分:8)
使用InternalsVisibleTo
属性标记您的程序集,并且您不需要在测试dll中使用反射。
e.g。在应用程序的AssemblyInfo.cs文件中,添加以下行:
[assembly:InternalsVisibleTo("TestAssembly")]
有关详细信息,请参阅here。
答案 1 :(得分:6)
答案 2 :(得分: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
。如果我们能够确定这与您的实际代码之间的差异,我们可能会发现问题。