0

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

我想知道在 Fluent Assertion 中使用 ContainValue 在 Dictionary 中搜索值的方法是否正确。

这是代码

    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.

**

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

谢谢,

4

1 回答 1

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 */);
于 2014-06-19T01:04:34.433 回答