Как проверить равенство элементов двух списков, используя Assert в Nunit - PullRequest
0 голосов
/ 14 января 2020

Я довольно новичок в модульном тестировании. Следующий код только для справки. Я хочу проверить, что empId первого списка совпадает с emp id списка 2.

public class EmpInfo
{    
    public EmpInfo( string lastName,string firstName, string empId)
    {
        EAlphabeticLastName = lastName;
        EFirstName = firstName;
        EmpId = empId;
    }
}

[Test]
[Category("Explicit")]
public void testEmp() 
{
    public List<EmpInfo> List1e = new List<EmpInfo>(){        
            new EmpInfo("dx","Tex","25")  
    };

    public List<EmpInfo> List2e = new List<EmpInfo>(){          
            new EmpInfo("dx","Tex","25")  
    };
    Assert.AreEqual(List1e.empId,List2e.empId);
}

Как правильно проверить равенство элементов списка в Nunit (C#)?

Ответы [ 4 ]

1 голос
/ 14 января 2020

Возможно, вам придется переопределить метод Equals и GetHashCode в классе EmpInfo и написать логи сравнения c.

Используйте вышеуказанные методы, чтобы проверить, все ли объекты в одном списке присутствуют в другом.

0 голосов
/ 15 января 2020

Есть множество способов достичь этого

  1. Использование https://fluentassertions.com/objectgraphs/ (Самый простой и быстрый способ)
    List1e.Should().BeEquivalentTo(List2e);

Переместить все отдельные сравнения в метод .Equals (Или реализовать IEqualityComparer)

Построить вспомогательный метод, который перебирает свойства publi c по отражению и отстаивать каждое свойство

      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 (!Equals(expectedValue, actualValue))
                Assert.Fail("Property {0}.{1} does not match. Expected: {2} but was: {3}", property.DeclaringType.Name, property.Name, expectedValue, actualValue);
          //……………………………….
        }

Используйте JSON для сравнения данных объекта
    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);
    }
Использование Ограничения свойств (NUnit 2.4.2)
0 голосов
/ 14 января 2020

Альтернативы проверке того, что список содержит только элементы с одинаковым идентификатором:

  1. Реализация равенства для класса EmpInfo, как предложено User965207, путем переопределения Equals или реализация интерфейса IEquatable. NUnit будет использовать любой из них, если присутствует. Если у вас нет контроля над кодом тестируемой системы, он, конечно, недоступен.

  2. Используйте оператор Select, чтобы создать новый список для сравнения. как предположил Шон. На самом деле вам нужно сделать это только для проверяемого фактического значения . Ваше ожидаемое значение может быть просто списком или массивом empids. Этот подход требует только изменения тестового кода.

  3. Используйте класс NUnit List, чтобы сделать по существу то же, что и вариант 2 для вас ...

    Assert.That ( List.Map (List1e) .Property ("empid"), Is.EqualTo (new [] {"empid1", "empid2" / et c /}));

    Поскольку вы не предоставили полную реализацию EmpInfo, я предположил, что empid является свойством. Если это поле, это не сработает.

Я понимаю, что не очень много добавил к предыдущим ответам здесь, но я подумал о возможных подходах с профессионалами и минусы будут полезны.

0 голосов
/ 14 января 2020

Как насчет Assert.IsTrue(List1e.SequenceEqual(List2e))

...