我有一些基本的类与克隆方法:单位在C#中测试的克隆方法与起订量
public class SimpleClass
{
public int ValueA { get; set; }
public string ValueB { get; set; }
public ulong ValueC { get; set; }
public SimpleClass TypedClone()
{
var item = new SimpleClass
{
ValueA = this.ValueA,
ValueB = this.ValueB,
ValueC = this.ValueC
};
return item;
}
}
我想一个单元测试,会告诉我,如果我加重视,但忘记将它添加到克隆方法。我的第一个尝试是使用Moq和它的VerifyGet方法来确保每个属性都被访问。
public void GenericCloneTest()
{
var mock = new Mock<SimpleClass>();
var c = mock.Object.GenericClone();
var properties = typeof(SimpleClass).GetProperties();
foreach (var property in properties)
{
var expression = Expression.Property(
Expression.Parameter(typeof(SimpleClass), "c"),
property);
var type = Expression.GetFuncType(typeof (SimpleClass),
property.PropertyType);
var actionExpression = Expression.Lambda(type, expression,
Expression.Parameter(typeof(SimpleClass), "c"));
mock.VerifyGet<object>
((Expression<Func<SimpleClass,object>>)actionExpression);
}
}
这并不工作,因为VerifyGet方法需要知道属性访问的返回类型,我想不出任何方式在运行时将其插入(你会发现我的跛脚企图使用撞击和燃烧的“物体”)。
我甚至不确定使用Moq是一个好主意,它只是我的第一个。
更新:由于没有快速简单的通用方法来测试克隆方法,我决定为每个类编写特定于类型的测试。这仍然让我知道何时添加属性的问题。我决定把它添加到我的克隆单元测试中:
var signature = typeof (Connection)
.GetProperties()
.Select(p => p.Name)
.Aggregate(
new StringBuilder(),
(builder, name) =>
builder.Append(name)).ToString();
Assert.AreEqual(
"DataSessionStateDataTechnologyBytesReceivedBytesSentDuration",
signature);
如果我添加属性,则测试将失败。当签名匹配失败时,它仍然依赖于我有足够的责任来解决测试的其余部分。
谢谢保罗!我一直认为必须有这样的.NET内置的东西,但还没有找到。这在我想做出快速浅拷贝的任何地方都很有用。 – MichaC 2009-04-18 02:37:01