如何检查是不是可以在 Fluent Assertion 中使用 ContainValue 验证类型类的字典
Posted
技术标签:
【中文标题】如何检查是不是可以在 Fluent Assertion 中使用 ContainValue 验证类型类的字典【英文标题】:How to check if Dictionary of type class can be verified using ContainValue in Fluent Assertion如何检查是否可以在 Fluent Assertion 中使用 ContainValue 验证类型类的字典 【发布时间】:2014-08-08 15:56:55 【问题描述】:我正在尝试将自定义类类型的字典检查为值。
我想知道在 Fluent Assertion 中使用 ContainValue 在字典中搜索值的方法是否正确。
这里是代码
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);
员工类
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.
**
请帮助我理解我在这里做错了什么。
谢谢,
【问题讨论】:
您是否在单元测试之外的某些上下文中使用 Fluent 断言?我问是因为传统上使用单元测试框架不会捕获异常,而是让测试运行程序将其作为失败处理。 @vossad01- 实际上我在普通的 C# 控制台应用程序项目中运行流利的断言,我在这里没有使用任何测试框架,如 MSTest 或 NUnit。只是看看流利断言是否真的适合我的需求 【参考方案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
。但是,整个类都是可变的,所以我不建议这样做,除非您还使用于确定 Equality 的任何成员不可变。
在不修改类的情况下,最好的办法是使用不同的断言,可能是这样的:
dictionary.Values.Should().Contain(employee =>
/* Logic for how you want to determine a match */);
【讨论】:
非常感谢 Vossad01,empDict.Values.Should().Contain(a => a.EmployeeID == 102);
的方法运行良好。我没有将字典替换为 empDict (我知道这就是您的意思)。答案非常具有解释性,对我帮助很大。非常感谢!!!以上是关于如何检查是不是可以在 Fluent Assertion 中使用 ContainValue 验证类型类的字典的主要内容,如果未能解决你的问题,请参考以下文章