Introduction
The following code snippet is a class that contains a method named PropertyValuesAreEquals
. Often while unit testing the code, we come across situations where we need to compare two objects or two lists w.r.t. their properties and values.We want to ensure if all the values of properties are same in object 1 as in object 2. This code is an implementation of the same logic that compares two objects and also two lists if objects parameter turns out to be a List. One can use this code while writing unit tests as a helper class to assert two objects, i.e., actual vs expected.
First, install NUnit through package manager to a particular project where you want to keep this class by writing the following command in package manager console.
Install NUnit package
Using the Code
Following is the helper class:
using System.Collections;
using System.Reflection;
using NUnit.Framework;
namespace TestsHelper
{
public static class AssertObjects
{
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))
if (property.DeclaringType != null)
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]);
}
}
}