#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 (я знаю, что вы имели в виду). Ответ был очень пояснительным и мне очень помог. Огромное спасибо!!!