【发布时间】:2010-07-08 05:30:56
【问题描述】:
我试图为私有内部类设置单元测试,但收效甚微:
namespace Stats.Model
{
public class DailyStat
{
private class DailyStatKey // The one to test
{
private DateTime date;
public DateTime Date
{
get { return date; }
set { date = value.Date; }
}
public StatType Type { get; set; }
public override int GetHashCode()
{
return Date.Year * 1000000 +
Date.Month * 10000 +
Date.Day * 100 +
(int)Type;
}
public override bool Equals(object obj)
{
DailyStatKey otherKey = obj as DailyStatKey;
if (otherKey == null)
return false;
return (this.Date == otherKey.Date && this.StatType == otherKey.StatType);
}
}
}
}
我试过这段代码:
PrivateType statKeyType = new PrivateType("Stats.Model", "Stats.Model.DailyStat.DailyStatKey");
还有
PrivateType statKeyType = new PrivateType("Stats.Model", "DailyStat.DailyStatKey");
无济于事。
程序集的名称是“Stats.Model”,对我来说类型名称看起来也正确,但我只是得到一个异常:“System.TypeLoadException:无法加载类型”
那我做错了什么?
据我所知,PrivateType 是基于反射的,我猜它几乎适用于这种情况,因为您不能在命名空间下直接拥有私有类。
编辑:
添加了 DailyStatKey 的完整实现。我要测试的是我的 GetHashCode 方法的唯一性。如您所见,我尝试将日期 + 类型放入单个 int 中。
【问题讨论】:
-
在 C# 中,“new SomeType(args)”不使用反射。相反,它始终是构造函数调用,并调用可用的构造函数之一。在您的示例代码中,没有构造函数,因此唯一可用的构造函数是默认构造函数(空构造函数——没有参数的构造函数)。您也不能从外部调用它,因为该类是私有的。所以你是对的,你需要反思。
-
我不太清楚你为什么提到关于构造函数的部分?我对使用反射的 PrivateType 的意思是,它使用它来访问私有类/方法。 (这在 MSDN 页面上非常明显:msdn.microsoft.com/en-us/library/… 因为它需要 ReflectionPermission。至于相关问题,是的,我知道不应该测试私有类,但因为它只在内部使用,并且 GetHashCode 始终至关重要返回一些独特的东西,我想我最好做一个测试。
-
天啊!你是对的。我误读了代码。我以为你出于某种原因输入了“new DailyStatKey(...)”。
-
很公平,我明白了:-)
标签: c# unit-testing private-members