C# 如何在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> {

我正在尝试检查自定义类类型的字典作为值

我想知道我在Fluent断言中使用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);
        }
    }
当我执行这段代码时,我得到了异常,如图所示

**

**

请帮助我理解我在这里做错了什么


谢谢,

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.