如何检查是不是可以在 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 =&gt; a.EmployeeID == 102); 的方法运行良好。我没有将字典替换为 empDict (我知道这就是您的意思)。答案非常具有解释性,对我帮助很大。非常感谢!!!

以上是关于如何检查是不是可以在 Fluent Assertion 中使用 ContainValue 验证类型类的字典的主要内容,如果未能解决你的问题,请参考以下文章

C# fluent 断言检查结果为 bool

用tecplot打开fluent的dat文件出现了问题

如何在fluent中得到机翼弦向表面压力分布

fluent编译UDF的过程中,出现了语法错误

请问fluent15.0如何打开单机并行计算,Intel MPI

Fluent NHibernate:如何使用约定在组件中指定列名以供参考?