Как проверить, можно ли проверить словарь типа class с помощью ContainValue в Fluent Assertion

#c# #assertions #fluent-assertions

#c# #утверждения #fluent-утверждения

Вопрос:

Я пытаюсь проверить словарь пользовательского класса типа как значение.

Я хотел бы знать, верен ли мой подход к поиску значения в словаре с использованием ContainValue в Fluent Assertion.

Вот код

     public static void VerifyDictionary()
    {
        try
        {
            Dictionary<int, Employee> empDict = new Dictionary<int, Employee>
            {
                { 1, new Employee() {EmployeeID = 100,Name="Karthik", EmployeeEmail="karthik@executeautomation.com", EmployeeAddress="Chennai,India"}},
                {2, new Employee() { EmployeeID = 101,Name="Jack",EmployeeEmail="Jack@jill.com",EmployeeAddress="CA"} },
                {3, new Employee() { EmployeeID=102,Name="Sam",EmployeeEmail="Sam@sung.com",EmployeeAddress="SFO"}},
                {4, new Employee() { EmployeeID=103,Name="Max",EmployeeEmail="micro@max.com",EmployeeAddress="India" }}
            };

            empDict.Should().ContainValue(new Employee() { EmployeeID = 10, EmployeeEmail = "micro@max.com", EmployeeAddress = "India", Name = "Max" }, "because thats the information I need");


        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
  

Класс Employee

 public class Employee
{
    public int EmployeeID { get; set; }
    public string Name { get; set; }
    public string EmployeeEmail { get; set; }
    public string EmployeeAddress { get; set; }
}
  

Пока я выполняю этот код, я получаю исключение, как показано

**

 Expected dictionary {[1, BDDDemo.Employee], [2, BDDDemo.Employee], [3, BDDDemo.Employee], [4, BDDDemo.Employee]} to contain value 
BDDDemo.Employee
{
   EmployeeAddress = "India"
   EmployeeEmail = "micro@max.com"
   EmployeeID = 10
   Name = "Max"
} because thats the information I need.
  

**

Пожалуйста, помогите мне понять, что я здесь делаю не так.

Спасибо,

Комментарии:

1. Используете ли вы Fluent Assertion в каком-либо контексте вне модульного тестирования? Я спрашиваю, потому что в рамках модульного тестирования традиционно вы не перехватываете исключение, а вместо этого позволяете тестировщику обрабатывать его как сбой.

2. @vossad01 — На самом деле я использую fluent assertion в обычном проекте консольного приложения C #, я не использую здесь какие-либо тестовые фреймворки, такие как MSTest или NUnit. Просто чтобы посмотреть, действительно ли Fluent Assertion работает для моих нужд

Ответ №1:

ContainValue проверка того, есть ли значение в словаре или нет, основана на Equals методе значений в словаре.

В этом случае Employee не переопределяет Equals , поэтому используется реализация, унаследованная от Object; то есть будет использоваться ссылочное равенство.

В качестве примера, следующий код будет проходить:

 var expected = new Employee { EmployeeID = 10 };
var dictionary = new Dictionary<int, Employee> { {1, expected} };
dictionary.Should().ContainValue( expected );
  

Однако это приведет к сбою, поскольку они являются двумя разными экземплярами Employee , хотя все их члены одинаковы:

 var expected = new Employee { EmployeeID = 10 };
var dictionary = new Dictionary<int, Employee> { {1, expected} };
dictionary.Should().ContainValue( new Employee { EmployeeID = 10 } );
  

Чтобы выполнить этот более поздний переход, вы можете переопределить Equals . Однако весь класс является изменяемым, поэтому я не могу рекомендовать это, если вы также не сделаете неизменным тот элемент (ы), который вы используете для определения равенства.

Без изменения класса лучше всего использовать другое утверждение, возможно, в следующем порядке:

 dictionary.Values.Should().Contain(employee => 
    /* Logic for how you want to determine a match */);
  

Комментарии:

1. Большое спасибо Vossad01, подход empDict.Values.Should().Contain(a => a.EmployeeID == 102); сработал нормально. Вместо dictionary я заменил его на empDict (я знаю, что вы имели в виду). Ответ был очень пояснительным и мне очень помог. Огромное спасибо!!!