Sammenlign lighed mellem to objekter i NUnit

Sammenlign lighed mellem to objekter i NUnit

Hvis du af en eller anden grund ikke kan tilsidesætte Equals, kan du bygge en hjælpemetode, der gentager offentlige egenskaber ved refleksion og hævder hver egenskab. Noget som dette:

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]);
    }
}

Tilsidesæt ikke Equals kun til testformål. Det er kedeligt og påvirker domænelogikken. I stedet

Brug JSON til at sammenligne objektets data

Ingen yderligere logik på dine objekter. Ingen ekstra opgaver til test.

Bare brug denne enkle metode:

public static void AreEqualByJson(object expected, object actual)
{
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    var expectedJson = serializer.Serialize(expected);
    var actualJson = serializer.Serialize(actual);
    Assert.AreEqual(expectedJson, actualJson);
}

Det ser ud til at fungere fantastisk. Testløberresultatoplysningerne vil vise JSON-strengsammenligningen (objektgrafen) inkluderet, så du direkte kan se, hvad der er galt.

Bemærk også! Hvis du har større komplekse objekter og blot ønsker at sammenligne dele af dem, kan du (bruge LINQ til sekvensdata ) oprette anonyme objekter til brug med ovenstående metode.

public void SomeTest()
{
    var expect = new { PropA = 12, PropB = 14 };
    var sut = loc.Resolve<SomeSvc>();
    var bigObjectResult = sut.Execute(); // This will return a big object with loads of properties 
    AssExt.AreEqualByJson(expect, new { bigObjectResult.PropA, bigObjectResult.PropB });
}

Prøv FluentAssertions-biblioteket:

dto.ShouldHave(). AllProperties().EqualTo(customer);

http://www.fluentassertions.com/

Det kan også installeres ved hjælp af NuGet.