C# 如何在Fluent断言中使用ContainValue检查类型类的字典是否可以验证
我正在尝试检查自定义类类型的字典作为值 我想知道我在Fluent断言中使用ContainValue在字典中搜索值的方法是否正确 这是密码C# 如何在Fluent断言中使用ContainValue检查类型类的字典是否可以验证,c#,assertions,fluent-assertions,C#,Assertions,Fluent Assertions,我正在尝试检查自定义类类型的字典作为值 我想知道我在Fluent断言中使用ContainValue在字典中搜索值的方法是否正确 这是密码 public static void VerifyDictionary() { try { Dictionary<int, Employee> empDict = new Dictionary<int, Employee> {
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);
}
}
当我执行这段代码时,我得到了异常,如图所示
**
**
请帮助我理解我在这里做错了什么
谢谢,
ContainValue
检查值是否在字典中是基于字典中的值的Equals
方法
在这种情况下,Employee
不会覆盖Equals
,因此使用从对象继承的实现;也就是说,将使用引用相等
例如,以下代码将通过:
var预期=新员工{EmployeeID=10};
var dictionary=新字典{{1,应为};
dictionary.Should().ContainValue(预期值);
但是,这将失败,因为它们是Employee
的两个不同实例,即使它们的所有成员都相同:
var预期=新员工{EmployeeID=10};
var dictionary=新字典{{1,应为};
dictionary.Should().ContainValue(新员工{EmployeeID=10});
要使后面的案例通过,您可以覆盖Equals
。但是,整个类是可变的,所以我不建议这样做,除非您还将用于确定相等性的成员设置为不可变
在不修改类的情况下,最好使用不同的断言,大致如下:
dictionary.Values.Should().Contain(employee=>
/*确定匹配方式的逻辑*/);
您是否在单元测试之外的上下文中使用Fluent断言?我这样问是因为在传统的单元测试框架中,您不会捕获异常,而是让测试运行者将其视为失败来处理。@vossad01-实际上,我在普通的C#console应用程序项目中运行fluent断言,这里我没有使用任何像MSTest或NUnit这样的测试框架。只是想看看Fluent断言是否真的能满足我的需要谢谢你这么多Vossad01,方法empDict.Values.Should().Contain(a=>a.EmployeeID==102)代码>工作正常。我把字典换成了empDict(我知道这就是你的意思)。答案很有说明性,对我帮助很大。非常感谢!!!
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.