我正在针对我们的缓存机制编写测试,并且我想确保进入缓存的内容与出现的内容相同,即所有属性都匹配。这是一个虚构的例子,说明我希望它如何工作
[Test]
public void add_client_model_member_to_cache_then_retreve()
{
//arrange
MemcachedClient client = new MemcachedClient();
Member member = GetMember();
client.Store(StoreMode.Set, "membertest", member);
// act
var result = client.Get<Member>("membertest");
// assert
Assert.AreMatch(result, member);
}
对每个属性执行Assert.AreEqual是不可行的,因为会有很多这些测试,每个属性都有很多属性。
哇,谢谢乔恩。我想你在一分钟之内就回答了这个问题。以下是我为任何相关方提供的解决方案。我实现了Jon建议(我认为)但是我遇到了数组属性的一点麻烦,因此我的解决方案只处理整数数组(我目前需要的所有)。如果我试图检查深度超过一个级别,它也会变得相当滑。我确信这可以实现,但是出于我的目的,这不是必需的。
private bool AreMatch(object initial, object result)
{
if (initial.Equals(result))
return true;
foreach (var property in initial.GetType().GetProperties())
{
var initialPropValue = property.GetValue(initial,null);
var resultPropValue = result.GetType().GetProperty(property.Name).GetValue(result,null);
if (property.PropertyType.IsArray)
{
if ((initialPropValue != null && resultPropValue != null) && !Enumerable.SequenceEqual((int[])initialPropValue, (int[])resultPropValue))
return false;
}
else if (!object.Equals(initialPropValue, resultPropValue))
{
return false;
}
else if (initialPropValue != null && property.PropertyType.IsClass)
{
// Don't go deeper than one level, this got me into trouble
//if (!AreMatch(initialPropValue, resultPropValue))
// return false;
}
}
return true;
}
以上方法可用于以下情况
[Test]
public void cached_result_is_same_as_original()
{
//arrange
Member member = GetMember();
client.Store(StoreMode.Set, "membertest", member);
// act
var result = client.Get<Member>("membertest");
// assert
Assert.IsTrue(AreMatch(member, result));
}
[Test]
public void cached_result_is_same_as_original()
{
//arrange
Member member = GetMember();
client.Store(StoreMode.Set, "membertest", member);
// act
var result = client.Get<Member>("membertest");
result.FirstName = "Result is different";
// assert
Assert.IsFalse(AreMatch(member, result));
}
答案 0 :(得分:3)
嗯,你当然可以通过所有属性编写一些内容,然后调用object.Equals
来获取预期和实际属性值的结果。使用Type.GetProperties()
自行获取属性,使用PropertyInfo.GetValue
获取值。
这有点粗糙,但如果有必要,你可以随时调整它。