Please see the code below:
public static class AssertEx
{
public static void PropertyValuesAreEquals(object actual, object expected)
{
PropertyInfo[] properties = expected.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
object expectedValue = property.GetValue(expected, null);
object actualValue = property.GetValue(actual, null);
if (actualValue is IList)
AssertListsAreEquals(property, (IList)actualValue, (IList)expectedValue);
else if (!Equals(expectedValue, actualValue))
Assert.Fail("Property {0}.{1} does not match. Expected: {2} but was: {3}", property.DeclaringType.Name, property.Name, expectedValue, actualValue);
}
}
private static void AssertListsAreEquals(PropertyInfo property, IList actualList, IList expectedList)
{
if (actualList.Count != expectedList.Count)
Assert.Fail("Property {0}.{1} does not match. Expected IList containing {2} elements but was IList containing {3} elements", property.PropertyType.Name, property.Name, expectedList.Count, actualList.Count);
for (int i = 0; i < actualList.Count; i++)
if (!Equals(actualList[i], expectedList[i]))
Assert.Fail("Property {0}.{1} does not match. Expected IList with element {1} equals to {2} but was IList with element {1} equals to {3}", property.PropertyType.Name, property.Name, expectedList[i], actualList[i]);
}
}
I took this from here: Compare equality between two objects in NUnit (Juanmas' answer)
Say I have an interface like this:
public interface IView
{
decimal ID { get; set; }
decimal Name { get; set; }
}
I then have two views like this:
IView view = new FormMain();
IView view2 = new FormMain();
view and view2 are then given properties.
I then want to compare the interfaces so I do this:
Assert.AreEqual(Helper.PropertyValuesAreEquals(view, view2), true);
However, this produces an exception:
"Property Get method was not found.".
How can I ensure this function only gets properties for the properties in my interface?
Should I even be unit testing a view like this?